POSIX スレッドの動作を望む場合は、-lpthread ライブラリをロードしてください。Solaris スレッドの動作を望む場合は、-lthread ライブラリをロードします。POSIX のプログラマでも、-lthread を指定してリンクすることにより、Solaris での fork() と fork1() の区別を維持したい場合があるでしょう。-lpthread を実行すると、fork() の動作を Solaris の fork1() 呼び出しと同じものにし、alarm(2) の動作を変更します。
libthread を使用するには -lthread を ld コマンドでは -lc の前、cc コマンドでは最後にそれぞれ指定してください。
libpthread を使用するには -lpthread を ld コマンドでは -lc の前、cc コマンドでは最後にそれぞれ指定してください。
スレッドを用いないプログラムをリンクするときは、-lthread と -lpthread は指定しないでください。指定すると、リンク時にマルチスレッド機構が設定され、実行時に動作してしまいます。これは、シングルスレッドアプリケーションの実行速度を低下させ、資源を浪費し、デバッグの際に誤った結果をもたらします。
図 7-1 は、コンパイルオプションを図解したものです。
混用の場合は、thread.h と pthread.h の両方を組み込む必要があります。
リンクで -lthread も -lpthread も指定しないと、libthread と libpthread に対するすべての呼び出しが動作しなくなります。実行時ライブラリ libc には、libthread と libpthread 内の関数の仮エントリが NULL 手続きとして数多く定義されています。正しい手続きは、libc とスレッドライブラリ (libthread または libpthread) の両方がリンクされたときに、そのスレッドライブラリによって挿入されます。
次のように正しくないフラグを指定して ld コマンドでプログラムをリンクすると、C ライブラリの動きが保証できなくなります。
.o's ... -lc -lthread ... (正しくない) または .o's ... -lc -lpthread ... (正しくない)
スレッドを使用する C++ プログラムでは、アプリケーションをコンパイルしてリンクするには、-lthread ではなく -mt オプションを使用します。-mt オプションは libthread とリンクし、ライブラリを適切な順序でリンクします。-lthread オプションを使用すると、プログラムがコアダンプすることがあります。