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

SIGWAITING − 待ち状態のスレッドのための LWP の生成

スレッドライブラリは通常、プログラムを実行するのに十分な数の LWP が実行資源内に存在することを保証します。

プロセス内のすべての LWP が無期限の待ち状態でブロックされる (たとえば、端末またはネットワークからの読み取りがブロックされる) と、オペレーティングシステムは SIGWAITING というシグナル (新たに導入されたシグナル) をプロセスに送ります。このシグナルはスレッドライブラリで処理されます。このとき、実行待ちのスレッドがプロセス内にあれば新しい LWP を生成し、適当な待ち状態のスレッドを選択して、新しい LWP に割り当てて実行します。

SIGWAITING 機構は、複数のスレッドが計算を目的としていて、もう 1 つ別のスレッドが実行可能になった場合に新しい LWP が生成されるかどうかを保証していません。計算を目的とするスレッドは、LWP の不足のために複数の実行可能なスレッドが動作するのを妨げることがあります。

thr_setconcurrency(3T) を呼び出すことによって、これを防ぐことができます。POSIX スレッドで thr_setconcurrency() を使用すると POSIX 準拠ではなくなりますが、計算量の多い状況で非結合スレッド用の LWP が不足するのを回避するには、この使い方が望ましいでしょう。(POSIX に完全に準拠し LWP の不足も回避する唯一の方法は、PTHREAD_SCOPE_SYSTEM 結合スレッドのみを生成することです。)

thr_setconcurrency(3T) 関数の使用方法の詳細は、「スレッドの並行度 (Solaris スレッドの場合のみ)」を参照してください。

Solaris スレッドでは、thr_create(3T) 呼び出しで THR_NEW_LWP を使って、別の LWP を生成するという方法もあります。