10.3 C++ 標準ライブラリのオブジェクトのスレッド間での共有
10.4 マルチスレッド環境での従来の iostream の使用
10.4.1 マルチスレッドで使用しても安全な iostream ライブラリの構成
10.4.1.2 マルチスレッドで使用しても安全な libC ライブラリを使用したコンパイルとリンク
10.4.1.3 マルチスレッドで使用しても安全な iostream の制約
10.4.1.4 マルチスレッドで使用しても安全なクラスのパフォーマンスオーバーヘッドの削減
C++ コンパイラに付属しているライブラリは、すべてマルチスレッドで使用しても安全です。マルチスレッドアプリケーションを作成したい場合や、アプリケーションをマルチスレッド化されたライブラリにリンクしたい場合は、-mt オプションを付けてプログラムのコンパイルとリンクを行う必要があります。このオプションを付けると、–D_REENTRANT がプリプロセッサに渡され、–lthread が ld に正しい順番で渡されます。互換性モード (-compat[=4]) の場合、-mt オプションは libthread を libC の前にリンクします。標準モード (デフォルトモード) の場合、-mt オプションは libthread を ibCrun の前にリンクします。マクロとライブラリを指定する代わりに、より簡単でエラーの発生しにくい方法である —mt を使用することをお勧めします。
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、 ibiostream、libCstd、libC) は、マルチスレッドで使用しても安全ですが、非同期では安全 (非同期例外で使用しても安全) ではありません。したがって、マルチスレッドアプリケーションのシグナルハンドラでは、これらのライブラリに含まれている関数を使用しないでください。使用するとデッドロックが発生する可能性があります。
マルチスレッドアプリケーションのシグナルハンドラでは、次のものは安全に使用できません。
iostream
new 式と delete 式
例外