Sun Studio 12: C++ ユーザーズガイド

11.1 マルチスレッドプログラムの構築

C++ コンパイラに付属しているライブラリは、すべてマルチスレッドで使用しても安全です。マルチスレッドアプリケーションを作成したい場合や、アプリケーションをマルチスレッド化されたライブラリにリンクしたい場合は、-mt オプションを付けてプログラムのコンパイルとリンクを行う必要があります。このオプションを付けると、-D_REENTRANT がプリプロセッサに渡され、-lthreadld に正しい順番で渡されます。互換性モード (-compat[=4]) の場合、-mt オプションは libthreadlibC の前にリンクします。標準モード (デフォルトモード) の場合、-mt オプションは libthreadlibCrun の前にリンクします。

-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 が正しい順番でリンクされない

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

11.1.2 C++ サポートライブラリの使用

C++ サポートライブラリ (libCrunlibiostreamlibCstdlibC) は、マルチスレッドで使用しても安全ですが、非同期安全 (非同期例外で使用しても安全) ではありません。したがって、マルチスレッドアプリケーションのシグナルハンドラでは、これらのライブラリに含まれている関数を使用しないでください。使用するとデッドロックが発生する可能性があります。

マルチスレッドアプリケーションのシグナルハンドラでは、次のものは安全に使用できません。