マルチスレッドのプログラミング

libthread または libpthread とのリンク

POSIX スレッドの動作を望む場合は、-lpthread ライブラリをロードしてください。Solaris スレッドの動作を望む場合は、-lthread ライブラリをロードします。POSIX のプログラマでも、-lthread を指定してリンクすることにより、Solaris での fork()fork1() の区別を維持したい場合があるでしょう。-lpthread を実行すると、fork() の動作を Solaris の fork1() 呼び出しと同じものにし、alarm(2) の動作を変更します。

libthread を使用するには -lthreadld コマンドでは -lc の前、cc コマンドでは最後にそれぞれ指定してください。

libpthread を使用するには -lpthreadld コマンドでは -lc の前、cc コマンドでは最後にそれぞれ指定してください。

スレッドを用いないプログラムをリンクするときは、-lthread-lpthread は指定しないでください。指定すると、リンク時にマルチスレッド機構が設定され、実行時に動作してしまいます。これは、シングルスレッドアプリケーションの実行速度を低下させ、リソースを浪費し、デバッグの際に誤った結果をもたらします。

図 7-1 は、コンパイルオプションを図解したものです。

図 7-1 コンパイルフローチャート

Graphic

混用の場合は、thread.hpthread.h の両方を組み込む必要があります。

リンクで -lthread-lpthread も指定しないと、libthreadlibpthread に対するすべての呼び出しが動作しなくなります。実行時ライブラリ libc には、libthreadlibpthread 内の関数の仮エントリが NULL 手続きとして数多く定義されています。正しい手続きは、libc とスレッドライブラリ (libthread または libpthread) の両方がリンクされたときに、そのスレッドライブラリによって挿入されます。

次のように正しくないフラグを指定して ld コマンドでプログラムをリンクすると、C ライブラリの動きが保証できなくなります。


.o's ... -lc -lthread ... (正しくない)

または


.o's ... -lc -lpthread ... (正しくない)

注 -

スレッドを使用する C++ プログラムでは、アプリケーションをコンパイルしてリンクするには、-lthread ではなく -mt オプションを使用します。-mt オプションは libthread とリンクし、ライブラリを適切な順序でリンクします。-lthread オプションを使用すると、プログラムがコアダンプすることがあります。