最終確認日

排他制御

排他制御(mutual exclusion)とは、複数の処理(スレッドやプロセス)が同時に共有リソースへアクセスしないようにする仕組みである。これにより、レースコンディションやデータ破壊を防ぐ。

なぜ必要か

  • プログラムにおいて共有リソース(例: メモリ領域、ファイル、ソケットなど)を複数の処理が同時に変更しようとすると、予期せぬ結果になる。
  • そのため、ある処理がリソースを使っている間は、他の処理がアクセスできないようにする必要がある。

主な排他制御の手段

名前 説明
ロック (Lock) 明示的に「ロック」と「アンロック」を行う制御。
ミューテックス (Mutex) スレッド間の排他制御用ロック。通常1つのスレッドだけがロック可能。
セマフォ (Semaphore) 複数スレッドに「制限付きで」同時アクセスを許可。カウント付き。
モニタ (Monitor) オブジェクトに紐づけて排他制御を行う高レベル構造。JavaやC#で使用。

例えばなし

1つしかないトイレに複数人が来たとする。

  • 誰かが入っている間は「使用中」の札が出て他の人は入れない。
  • これが「排他制御」である。

注意点

  • デッドロック:複数の処理が互いにロックの解除を待ち合い、永遠に停止する状態。
  • ライブロック:互いに譲り合いすぎて、結果的に何も進まない。
  • スレッド飢餓:一部のスレッドが常に待たされ、実行されない。
サイトアイコン
公開日
更新日