C++ コンパイラに付属しているライブラリは、すべてマルチスレッドで使用しても安全です。マルチスレッドアプリケーションを作成したい場合や、アプリケーションをマルチスレッド化されたライブラリにリンクしたい場合は、-mt オプションを付けてプログラムのコンパイルとリンクを行う必要があります。このオプションを付けると、-D_REENTRANT がプリプロセッサに渡され、-lthread が 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 が正しい順番でリンクされない |
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 式
例外