Sun Studio 12:C++ 用户指南

11.1 生成多线程程序

C++ 编译器附带的所有库都是多线程安全的。如果需要生成多线程应用程序,或者需要将应用程序链接到多线程库,必须使用 –mt 选项编译和链接程序。此选项会将 –D_REENTRANT 传递给预处理程序,并按正确的顺序将 –l线程传递给 ld。在兼容模式 (–compat[=4]) 下,–mt 选项可确保 libthreadlibC 之前链接。在标准模式(缺省模式)下,-mt 选项可确保 libthreadlibCrun 之前链接。

请勿使用 –lthread 直接链接应用程序,因为这将导致以错误顺序链接 libthread

以下示例显示了当编译和链接分开进行时,生成多线程应用程序的正确方法:


example% CC -c -mt myprog.cc
example% CC -mt myprog.o

以下示例显示了生成多线程应用程序的错误方法:


example% CC -c -mt myprog.o
example% CC myprog.o -lthread < -libthread is linked incorrectly

11.1.1 表明多线程编译

可以通过使用 ldd 命令检查应用程序是否链接到 libthread


example% CC -mt myprog.cc
example% ldd a.out
libm.so.1 =>      /usr/lib/libm.so.1
libCrun.so.1 =>   /usr/lib/libCrun.so.1
libthread.so.1 => /usr/lib/libthread.so.1
libc.so.1 =>      /usr/lib/libc.so.1
libdl.so.1 =>     /usr/lib/libdl.so.1

11.1.2 与线程和信号一起使用 C++ 支持库

C++ 支持库 libCrunlibiostreamlibCstdlibC 是多线程安全的,但不是异步安全。这意味着,在多线程应用程序中,支持库中可用的函数不能用于信号处理程序中。这样做的话将导致死锁状态。

在多线程应用程序的信号处理程序中使用下列内容是不安全的: