排他制御という言葉は、通常の会話では使わないため、なんだかピンときませんね。このような時は、アナロジー(何かに例えて考える)を使うとよいでしょう。
筆者は、排他制御を「トイレ」で例えるのが分かりやすいと思いました。
前提条件を下記に示します。
上記の前提を使って、排他制御について説明します。
家族4人暮らしですから、1つのトイレを家族全員で共有しますね(図3)。
図3に示す通り、4人家族のうち誰か1人がトイレを使用します。これは、プログラムの世界では、在庫数のような複数の処理から同時にアクセスする対象を表しますね。これを、「共有資源(Shared Resource)」といいます。
「1度に1人しか使えない」というルールから、複数人で同時にトイレを使用できません。よって、もし、お父さんが使用中に息子がトイレに入ると問題が発生するでしょう(図4)。
プログラムの世界でも同様の問題が発生します。例えば、2人のお客が同時に購入処理を行う場合、片方が在庫を読み取って更新しようとする途中で、もう片方が同じ在庫を書き換えるというケースが発生します。
このように、複数の処理が同時に同じものを使おうとしてぶつかる状態を「競合状態(race condition)」と呼びます。
競合を防ぐ最も確実な方法は、トイレに入ったらカギを掛け、他の人が入れないようにすることです(図5)。
図5の通り、お父さんが使用中の時は、カギを掛けることで、息子がトイレに入ってくることはありません。このように、トイレを使用する場合は、カギを掛けることで、他の人がトイレに入ることを防ぎます。
プログラムの世界では、ある処理が共有資源にアクセスする間、他の処理がアクセスできないようにする仕組みを「排他制御」と言います。また、共有資源を占有する操作を「ロック(lock)」、開放する操作を「アンロック(unlock)」と言います。
Copyright © ITmedia, Inc. All Rights Reserved.
組み込み開発の記事ランキング
コーナーリンク
よく読まれている編集記者コラム