パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
スレッド

スレッドとはCPU利用の単位でプログラム実行のコンテキスト情報が少なくプロセスより切り替えが速い。

その他の外部情報

本サイトでの解釈

現代のパソコン/オペレーティングシステムウィンドウズ含めプリエンプティブ・マルチタスクで、複数のタスクをオペレーティングシステムが強制的に切り替えて(タスクスケジューリング)実行する。タスクとはコンピュータの活動単位で、プロセスとスレッドがある。

プロセス

プロセスは他と独立したメモリ空間を持ち1個以上のスレッドで構成される。プロセスは実行中のアプリケーション(あるいはプログラム)と同義と見なす。プロセスは他のプロセスを起動する事があり、これを子プロセスと呼ぶ。複数プロセスを構成しながらユーザーから一つのアプリケーションに見える物もあるが、開発の見地ではこの場合も複数と見なしてプロセスとアプリケーションを1対1に対応づけて考えた方が良い。プロセス間のデータ交換はプロセス間通信と呼ばれオペレーティングシステムは様々な方法を用意するが、選択や実装にかなりのハードルを感じるかもしれない。

スレッド

プロセスは新たなスレッドを起動して複数スレッドで構成する事ができる。例えばGUIアプリケーションで時間のかかる内部処理を持つ場合、ビジーカーソル(砂時計かクルクル)が回り続け操作不能となりユーザーにストレスを与える。こういった場合、内部処理を別スレッドで実行し終了をメッセージあるいはカーネルオブジェクトでGUIスレッドに通知するのが常道だろう。スレッド間のデータ交換はメモリ空間を共有しプロセス間通信に比べ容易だが排他制御が問題となる。

排他制御

複数プロセス/スレッドが同一資源(例えばメモリ、ファイル)にアクセスするとき、正しくアクセス(マーシャリング)させないとエラーとなる。プロセス間通信のほとんどは排他制御を強制し、開発者も十分意識してコーディングするので意外と安全である。例えばウィンドウズAPIのCreatePipeはパイプ(プロセス間通信を実現するファイルオブジェクト)を作成するが、そのハンドルはクローズしない限り他プロセスからのアクセスはロックされる。すなわち子プロセスに渡したハンドルのクローズを忘れると子プロセスがハングアップする事になるが、エラーに気づかないよりは遥かに良い。

スレッド間のデータ交換はメモリ空間共有で簡単だが、アクセスの度にカーネルオブジェクトなどで排他制御する必要がある。しかしC++ソースコード上は普通の変数参照に過ぎず忘れてしまうのが常である。エラーのもたらす不具合はタスクスケジューリングで発生したりしなかったりするし、症状も一定せずデバッグ困難な場合が多い。