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

libthread または libpthread とのリンク

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

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

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

Solaris 9 以降のリリースでは、スレッドを使用しないプログラムをリンクするときに、-lthread または -lpthread を指定しても、意味上の違いは発生しません。これまでの単一スレッドで構成されたプログラムと同様に、余計なスレッドや LWP は作成されず、メインスレッドが唯一のスレッドとして実行されます。プログラムに対する唯一の影響は、システムライブラリのロックが空関数の呼び出しではなく本当のロックになるので、競合することのないロックを獲得する必要が生じることです。

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

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

コンパイルオプションのフローチャートを示しています。

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

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


注 –

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