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

結合スレッド

非結合スレッドで起こりがちなことですが、スレッド数を LWP 数よりも大きくすると不利な場合があります。

たとえば、行列を並列に計算するために、行列の行を複数のスレッドに振り分ける場合を考えます。各プロセッサに 1 つの LWP が存在するが各 LWP に複数のスレッドを割り当てる場合は、各プロセッサの時間がスレッドの切り替えのために費やされます。このような場合は、各 LWP には単一のスレッドを割り当てて、行列の行を振り分けるスレッドの数を減らし、スレッドを切り替える回数を減らすほうが効果的です。

LWP に固定的に結合されたスレッドと非結合スレッドを混在させると都合がよい場合もあります。

たとえば、リアルタイムアプリケーションでは、一部のスレッドにシステム全体での優先順位を与えてリアルタイムでスケジューリングし、他のスレッドにバックグラウンドで計算を実行させます。もう 1 つの例はウィンドウシステムです。ウィンドウシステムでは大半の処理を非結合スレッドで実行し、マウスに関する処理を優先順位の高いリアルタイムの結合スレッドで実行します。

ユーザレベルのスレッドがシステムコールを発行すると、そのスレッドを実行している LWP はカーネル内部に入り、少なくともシステムコールが完了するまでの間はスレッドに接続されたままの状態となります。

結合スレッドは、非結合スレッドより負荷がかかります。結合スレッドは、結合している LWP の属性を変更することがあるので、終了時に LWP がキャッシュされることはありません。オペレーティング環境は、結合スレッドに対して生成時に新しい LWP を与え、終了時にその LWP を削除します。

結合スレッドを使用するのは、次の場合に限ってください。すなわち、結合している LWP を通してのみ利用可能なリソース (たとえば、仮想時間インタバルタイマ、代替スタック) をスレッドが必要としている場合か、スレッドをカーネルから参照可能にしてシステム内のすべての実行可能なスレッドとの関係でスケジューリングされるようにする (たとえば、リアルタイムスケジューリング) 場合です。

すべてのスレッドが同時に実行可能になることが期待される場合は、非結合スレッドを使用してください。そうすれば LWP とスレッドのリソースが効率的にキャッシュされるので、スレッドの生成と削除が高速で行われるようになります。thr_setconcurrency(3T) を使用すると、Solaris スレッドに対して同時に有効にしたいスレッド数 (目標値) を伝えることができます。