Oracle Solaris Studio 12.2:C++ 用户指南

10.1 生成多线程程序

C++ 编译器附带的所有库都是多线程安全的。如果需要生成多线程应用程序,或者需要将应用程序链接到多线程库,必须使用 –mt 选项编译和链接程序。此选项会将 –D_REENTRANT 传递给预处理程序,并按正确的顺序将 –l thread 链接到 ld。在兼容模式 (–compat[=4]) 下,–mt 选项可确保在 libC 之前链接 libthread。在标准模式(缺省模式)下,-mt 选项可确保 libthread libCrun 之前链接。推荐使用 -mt,这是指定宏和库的替代方式,它更加简单且不易出错。

10.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

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

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

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