マルチスレッド化の基本的な概念

スレッドとは,プログラムから実行するパスのことです。これは,1 つのプロセスに属する実行形式の要素です。個々のプロセスは,プロセスの作成時に自動的に作成される,少なくとも 1 つの実行スレッドを持っています。主プログラムは最初のスレッドで実行されます。Win32 スレッドは,スタック,CPU レジスタの状態,セキュリティ・コンテキスト,およびシステム・スケジューラの実行一覧中の項目で構成されます。各スレッドはプロセスのすべてのリソースを共有します。

プロセスは,1 つまたは複数のスレッドと,メモリー内のプログラムのコード,データ,およびその他のリソースで構成されます。典型的なプログラム・リソースとしては,開かれたファイル,セマフォ (スレッド間通信の手段の 1 つ),および動的に割り付けられたメモリーなどがあります。プログラムは,システム・スケジューラがスレッドの 1 つに実行の制御を与えたときに実行されます。スケジューラはどのスレッドをいつ実行すべきかを決定します。優先度の低いスレッドは,優先度の高いスレッドが作業を終えるまで待たなくてはならないことがあります。マルチプロセッサー・マシンでは,スケジューラは個々のスレッドを異なるプロセッサーに移動して,CPU 負荷のバランスを取ることができます。

スレッドは,プロセス全体よりもシステム負荷が小さく,作成も簡単なので,他の作業と同時に実行できる時間またはリソース集中型の処理に有効です。スレッドは,バックグラウンド印刷,装置からの入力監視,編集中のデータのバックアップなどの処理に使用することができます。

スレッド,プロセス,ファイル,および通信機器が開かれると,それらを作成した関数はハンドルを返します。各ハンドルには,プロセスのセキュリティ・クレデンシャルを検証するために使用されるアクセス制御リスト (ACL) が関連付けられます。プロセスとスレッドは,この章で説明している関数を使って,ハンドルを継承したり,ハンドルを放棄したりすることができます。オブジェクトとハンドルはシステム・リソースの参照を規制します。ハンドルとセキュリティについての詳細は,「Win32 Application Programming Interface」(『Platform SDK』オンライン・ドキュメントなど) を参照してください。

1 つのプロセス内のすべてのスレッドは,互いに独立に実行されます。互いに通信を行えるように特殊な操作を行わない限り,各スレッドはプロセス内の他のスレッドの存在をまったく意識せずに動作します。共通のリソースを共有するスレッドは,セマフォやその他のスレッド間通信方式を使って,互いの作業を調整しなければなりません。スレッド間通信についての詳細は,「リソースの共有」を参照してください。