LWPは上述の2つの方式を組み合わせたもので、SolarisやSVR4.2MPで導入されたスレッド機構である。プログラミング上いくつでもスレッドを生成できるとしても、並列実行できるのはプロセッサ数までである。従って、カーネルスレッド方式のように全スレッドをカーネルが制御するのは無駄が大きい。そこでカーネルはLWPというスレッドを実行するオブジェクトを管理し、LWPが適当なユーザースレッドを選択して実行する。LWPの個数はプロセス当たりの上限(全プロセッサ数+α)が設定されているため無駄が少なくなり、ユーザースレッドはメモリなどが許す限り生成可能となる。また、ユーザースレッド間の切り替えをユーザー空間で行うため、オーバーヘッドはユーザースレッドとカーネルスレッドの中間になる。
LWPはCライブラリ内でスレッド作成の延長で必要に応じて作成される。Cライブラリ内のスレッドスケジューラが、ユーザースレッドとLWPのマッピングを行う。このマッピングを指して、LWP方式を「M対Nスレッド」と呼ぶことがある。つまり、ユーザープロセス内のM個のスレッドとカーネル内のN個のLWPがマッピングを切り換えながら実行されることを意味している。
カーネルはLWPに関するシステムコールを提供しており、Cライブラリがそれを使用する(ユーザーにも公開されているが、一般に直接使うことはほとんどない)。LWPはコンテキストスイッチの対象として扱われるため、LWP方式のオペレーティングシステムではプロセス制御ブロックの一部がLWP毎のデータ構造になっている。
また、LWPとユーザースレッドを固定的に結びつけることもでき、これを「結合スレッド」と呼ぶ(一般のスレッドは「非結合スレッド」)。
ユーザーインターフェイススレッド詳細は「ユーザーインターフェイススレッド」を参照
グラフィカルユーザインタフェースにおいては、デッドロックにまつわる複雑さを回避するためUIを操作するスレッドを1つに統一し、その上でワーカーデザインパターンを採用するという手法がよく採用される。 ライトウェイトスレッド(light-weight thread)または軽量スレッドとは、ユーザープロセス空間内で、疑似的にスレッディング動作を行わせることができる概念である。通常のスレッドと区別する場合に「論理スレッド」と呼ぶ場合がある。 ライトウェイトプロセスとは異なり、スタックなどに退避されている「スレッドコンテキスト情報」の、暗黙の切り替えは行われない場合がある。また、タイムスライスによる論理スレッドの切り替えが起きず、任意のタイミング(例:APIの呼び出し時)にのみ、論理スレッドが切り替わる。完全にユーザープロセス空間内で実現され、一般的に論理スレッドコンテキストの情報量は小さいため、論理スレッド切り替えのオーバーヘッドは非常に小さい。 ライトウェイトスレッドとして分類される機構として、コルーチンや、C#/VB.NETなどの.NET言語におけるイテレータブロックが挙げられる。 C言語やC++といった初期のプログラミング言語においては、スレッドは当初言語仕様では標準サポートされていなかった。そのため、例えばMicrosoft WindowsではWindows APIのスレッド、POSIX準拠OSではPOSIXスレッド (Pthreads) といったように、プラットフォーム固有のAPIを利用する必要があった。Javaや.NET Framework/.NET Coreに代表されるように、現代的なほとんどの後発言語およびプラットフォームではスレッドを標準的にサポートしている。 C++11規格ではBoost C++ライブラリをベースとしたスレッドライブラリが標準化された。C11規格でもスレッドライブラリが標準として定義されたが、実装は任意であり必須ではない[7]。 マルチスレッドのプログラミングは前述のように、シングルスレッド前提のプログラミングと比べて難易度が高い。マルチスレッドの動作は非決定論的であり、慎重にプログラミングしなければ、タイミングによって発生したりしなかったりする厄介な異常動作や不具合を引き起こすこともある。マルチスレッド環境におけるバグは、しばしば原因特定が困難となる。 一般的なアプリケーションプログラミングでは、スレッドを明示的に起動して利用することは少ない。代わりに、並列処理や並行処理のバックエンドとしてスレッドを暗黙的に利用する、上位レベルのAPIを利用することが多い。例としてOpenMPや、.NETのタスク並列ライブラリ
ライトウェイトスレッド
スレッドライブラリ
スレッドの暗黙的利用
脚注[脚注の使い方]
注釈^ 古いアーキテクチャや組み込み環境では、複数のプロセスがメモリ空間を共有しているシステムもある。例えばWin16などが挙げられる。
^ 例えば32ビット版のMicrosoft Windowsでは、個々のスレッドに割り当てられるスタックサイズが既定で1MiBとなっており、そのため1プロセスが生成できるスレッドの最大数(理論上限値)は既定で2,048までとなっている[4][5][6]。64ビット版Windowsでは理論上限値は緩和されるが、実際に生成可能なスレッドの数は物理メモリの搭載量に左右されることに変わりはない。
出典^ “スレッドとは - IT用語辞典
^ マルチスレッドの基本概念 (マルチスレッドのプログラミング) 。