クリティカルセクション【critical section】
概要

マルチタスクやマルチスレッドの環境では、複数のプロセスやスレッド(以下では便宜上両者をまとめてスレッドと呼ぶ)が同じメモリ領域やファイル、データベースなどを共有しながら並行して動作する。このとき、複数の処理が同じ資源に同時にアクセスすると、一方の結果がもう一方によって上書きされたり、更新途中の値が読み取られたりして、想定しない結果を招くことがある。
このような「競合状態」(race condition)が発生しうるコード上の区間をクリティカルセクションという。そのような区間は一度に一つのスレッドだけが実行できるようにする必要があり、排他制御によって保護される。クリティカルセクションに入ることができたスレッドだけが共有資源にアクセスできるようにする。
排他制御には「占有ロック」が用いられることが多い。あるスレッドがクリティカルセクションに入ると資源をロックして占有し、処理が完了するとロックを解放する。ロック中はその資源へのアクセスを求める他のスレッドは待機状態に置かれ、解放後に待機中のいずれかが次のロックを取得して実行を再開する。「ミューテックス」や「セマフォ」などの同期機構が用いられることもある。
主要なオペレーティングシステム(OS)やプログラミング言語にはクリティカルセクションを管理するための機能が備わっており、開発者は共有資源を扱う区間を明示的に指定して同期処理を記述する。ただし、制御を誤ると複数の処理が互いの解放を待ち続けてシステムが停止する「デッドロック」(deadlock)や、特定の処理がいつまでも資源を得られない「リソーススタベーション」(starvation:飢餓状態)が発生することがある。クリティカルセクションの範囲は必要最小限にとどめ、ロックの取得順序を適切に設計することが求められる。