イチから全部作ってみよう(33)「排他制御」をトイレのアナロジーで理解する:山浦恒央の“くみこみ”な話(202)(2/3 ページ)
ソフトウェア開発の全工程を学ぶ新シリーズ「イチから全部作ってみよう」。第33回は、複数人が同時にアクセスするシステムを開発するためのプログラミングで重要になる「排他制御」をトイレに例えて説明する。
4.トイレのアナロジーで考える
排他制御という言葉は、通常の会話では使わないため、なんだかピンときませんね。このような時は、アナロジー(何かに例えて考える)を使うとよいでしょう。
筆者は、排他制御を「トイレ」で例えるのが分かりやすいと思いました。
4.1 前提条件
前提条件を下記に示します。
- 環境:家族4人暮らしの一般家庭
- 設備:個室トイレが1つ
- ルール:1度に1人しか使えない
- 機能:内側から掛けられる「カギ」が付いている
上記の前提を使って、排他制御について説明します。
4.2 トイレは4人で共有して使用する
家族4人暮らしですから、1つのトイレを家族全員で共有しますね(図3)。
図3に示す通り、4人家族のうち誰か1人がトイレを使用します。これは、プログラムの世界では、在庫数のような複数の処理から同時にアクセスする対象を表しますね。これを、「共有資源(Shared Resource)」といいます。
4.3 トイレは複数人で使えない
「1度に1人しか使えない」というルールから、複数人で同時にトイレを使用できません。よって、もし、お父さんが使用中に息子がトイレに入ると問題が発生するでしょう(図4)。
プログラムの世界でも同様の問題が発生します。例えば、2人のお客が同時に購入処理を行う場合、片方が在庫を読み取って更新しようとする途中で、もう片方が同じ在庫を書き換えるというケースが発生します。
このように、複数の処理が同時に同じものを使おうとしてぶつかる状態を「競合状態(race condition)」と呼びます。
4.4 競合を防ぐためにはカギを掛ける(ロック)
競合を防ぐ最も確実な方法は、トイレに入ったらカギを掛け、他の人が入れないようにすることです(図5)。
図5の通り、お父さんが使用中の時は、カギを掛けることで、息子がトイレに入ってくることはありません。このように、トイレを使用する場合は、カギを掛けることで、他の人がトイレに入ることを防ぎます。
プログラムの世界では、ある処理が共有資源にアクセスする間、他の処理がアクセスできないようにする仕組みを「排他制御」と言います。また、共有資源を占有する操作を「ロック(lock)」、開放する操作を「アンロック(unlock)」と言います。
Copyright © ITmedia, Inc. All Rights Reserved.


