C++ コンパイラに添付されたすべてのライブラリはマルチスレッドに対して安全です。マルチスレッド化アプリケーションを構築したり、アプリケーションにマルチスレッド化ライブラリをリンクする場合は、プログラムを -mt オプションでコンパイルおよびリンクする必要があります。このオプションを指定すると、-D_REENTRANT がプリプロセッサに渡され、-lthread が正しい順序で ld に渡されます。-compat=4 の場合は、-mt オプションを指定すると、libthread が libC より前にリンクされます。アプリケーションを直接 -lthread とリンクすると、libthread が正しくない順序でリンクされる恐れがあります。
次の例は、マルチスレッドアプリケーションの正しい構築方法を示します。
demo% CC -c -mt myprog.cc demo% CC -mt myprog.o
次の例は、マルチスレッドアプリケーションの正しくない構築方法を示します。
demo% CC -c -mt myprog.o demo% CC myprog.o -lthread
アプリケーションに libthread がリンクされているかどうかは、ldd コマンドを使用して調べます。
demo% CC -mt myprog.cc demo% ldd a.out libm.so.1 => /usr/lib/libm.so.1 libCrun.so.1 => /usr/lib/libCrun.so.1 libw.so.1 => /usr/lib/libw.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 はマルチスレッドに対して安全ですが、async に対しては安全ではありません。つまり、マルチスレッド化アプリケーションでは、サポートライブラリの関数をシグナルハンドラで使用することはできません。使用すると、デッドロック状態になることがあります。
マルチスレッドアプリケーションでは、次の機能をシグナルハンドラで使用すると問題が起こる可能性があります。
iostream
new と delete
例外