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

マルチスレッドの構造

従来の UNIX でもスレッドという概念はすでにサポートされています。各プロセスに単一のスレッドが含まれるので、複数のプロセスを使うようにプログラミングすれば、複数のスレッドを使うことになります。しかし、1 つのプロセスは 1 つのアドレス空間でもあるので、1 つのプロセスを生成すると 1 つの新しいアドレス空間が作成されます。

新しいプロセスを生成するかわりに、スレッドを生成するとシステムへの負荷は小さくなります。これは、新たに生成されるスレッドが現在のプロセスのアドレス空間を使用するからです。スレッドの切り替えに要する時間は、プロセスの切り替えに要する時間よりも短くて済みます。これは、スレッドを切り替える上でアドレス空間を切り替える必要がないからです。

同じプロセスに属するスレッド間の通信は簡単に実現できます。それらのスレッドは、もっとも重要なアドレス空間を含め、あらゆるものを共有しているからです。したがって、あるスレッドで生成されたデータを、プロセス中のほかのすべてのスレッドがただちに利用できます。

ただしこのようにデータを共有すると、プログラマにとって別の一連の課題が発生します。データが複数のスレッドから一度に変更されたり、あるスレッドによって変更されている間に別のスレッドから同時に読み取られたりすることのないようにスレッドを同期化する必要があります。詳細については、「スレッド同期」を参照してください。

ユーザーレベルのスレッド

スレッドは、マルチスレッドプログラミングにおける基本プログラミングインタフェースです。スレッドは、それらが存在するプロセスの内部からだけ参照でき、アドレス空間や開いているファイルなどすべてのプロセスリソースを共有します。

ユーザーレベルのスレッドの状態

スレッドごとに固有な状態としては次のものがあります。

スレッドはプロセスの命令とプロセスデータの大部分を共有します。このため、あるスレッドによって共有データに加えられた変更は、プロセス内のほかのスレッドから認識できます。スレッドが自分と同じプロセス内の他のスレッドとやり取りを行う場合は、オペレーティング環境を介する必要はありません。


注 –

ユーザーレベルのスレッドという呼称は、システムプログラマだけが関係するカーネルレベルのスレッドと区別するためのものです。このマニュアルは、アプリケーションプログラマ向けであるため、カーネルレベルのスレッドについては触れません。