C++ ユーザーズガイド

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

C++ コンパイラに添付されたすべてのライブラリはマルチスレッドに対して安全です。マルチスレッド化アプリケーションを構築したり、アプリケーションにマルチスレッド化ライブラリをリンクする場合は、プログラムを -mt オプションでコンパイルおよびリンクする必要があります。このオプションを指定すると、-D_REENTRANT がプリプロセッサに渡され、-lthread が正しい順序で ld に渡されます。-compat=4 の場合は、-mt オプションを指定すると、libthreadlibC より前にリンクされます。アプリケーションを直接 -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

スレッドとシグナルでの libC の使用

C++ サポートライブラリ libCrunlibiostreamlibCstdlibC はマルチスレッドに対して安全ですが、async に対しては安全ではありません。つまり、マルチスレッド化アプリケーションでは、サポートライブラリの関数をシグナルハンドラで使用することはできません。使用すると、デッドロック状態になることがあります。

マルチスレッドアプリケーションでは、次の機能をシグナルハンドラで使用すると問題が起こる可能性があります。