C++ 编译器附带的所有库都是多线程安全的。如果需要生成多线程应用程序,或者需要将应用程序链接到多线程库,必须使用 –mt 选项编译和链接程序。此选项会将 –D_REENTRANT 传递给预处理程序,并按正确的顺序将 –l线程传递给 ld。在兼容模式 (–compat[=4]) 下,–mt 选项可确保 libthread 在 libC 之前链接。在标准模式(缺省模式)下,-mt 选项可确保 libthread 在 libCrun 之前链接。
请勿使用 –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 |
可以通过使用 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 |
C++ 支持库 libCrun、libiostream、libCstd 和 libC 是多线程安全的,但不是异步安全。这意味着,在多线程应用程序中,支持库中可用的函数不能用于信号处理程序中。这样做的话将导致死锁状态。
在多线程应用程序的信号处理程序中使用下列内容是不安全的:
iostream
new 和 delete 表达式
异常