イチから全部作ってみよう(33)「排他制御」をトイレのアナロジーで理解する山浦恒央の“くみこみ”な話(202)(3/3 ページ)

» 2026年06月17日 06時30分 公開
前のページへ 1|2|3       

4.5 カギがかかっていたら待機する

 誰かがトイレを使用中でカギが掛かっているときは、使い終わるまで待ちますね(図6)。

図6 図6 他の人が使用中のため待機するイメージ

 図6に示す通り、お父さんがトイレ使用中でカギが掛かっているため、息子は待機し続けます。お父さんがトイレから出てカギが開くと、息子はトイレに入り、再びカギを掛けます(図7)。

図7 図7 使用終了後トイレを使用する

 このように、共有資源をロックしている場合は、アンロックするまで待機します。これを、プログラムの世界では「待機(wait)」と言います。

4.6 カギがかかった状態で倒れた場合

 「お母さんがトイレ使用中に体調不良で倒れた」という緊急事態を考えてみましょう(図8)。

図8 図8 トイレ内での緊急事態のイメージ

 図8の場合、カギは内側にしかありませんので、誰もカギを開けることができず永遠にトイレを使用できませんし、お母さんを助け出すこともできません。

 プログラムの世界でも、ロックが開放できないまま処理が停止すると、他の処理がアンロック待ちで無限に待ち続けるという問題が発生します。これを、「ロックの開放漏れ」と言います。

 この問題を防ぐため、プログラムでは、次のような対策を行います。

(1)例外処理を行って必ずアンロックする

 例外(エラー)が発生した場合でも、必ずアンロックできる仕組みを作ります。例えば、try-finallyブロックを使い、finally節の中で、アンロック処理を呼び出します。これにより、正常/異常を問わずロックが開放できます。

 下記に、プログラムの記載イメージを示します(リスト1)。

try:
	# トイレに入ってカギを掛ける(ロック処理)
# 用を足す(共有資源へのアクセス処理)
finally:
	# トイレの中で何が起きても必ずカギを開けてドアを開ける(アンロック処理)
リスト1 トイレのプログラムのイメージ

(2)タイムアウトを設定する

 一定時間内に使用できない場合は、待機を打ち切る「タイムアウト」を設定します。これは、「3分待ってもトイレが開かないので、使うのを諦める」というイメージに相当します。

5.まとめ

 トイレとプログラムの話が行ったり来たりでしたので、最後に対応関係を表1にまとめます。

トイレの話 プログラムの世界 プログラムの用語
トイレ(家族全員で共有) データベースの在庫数など 共有資源
複数人が同時にトイレに入ろうとする 複数の処理が同時に同じデータを更新しようとする 競合状態
内側からカギを掛ける 他の処理がアクセスできないように占有する ロック
カギを開けてトイレから出る 占有を開放する アンロック
トイレ使用中は外で待つ ロックを開放するまで処理を停止する 待機
トイレ内でカギを掛けたまま倒れる ロックが開放できないまま処理が停止する ロックの開放漏れ
表1 トイレとプログラムの対応関係

 上記が、排他制御をトイレに例えて説明したアナロジーです。

6.おわりに

 今回は、排他制御の基本的なイメージをつかむため、身近な「トイレ」を例題にして説明しました。目に見えないプログラムの動きは、身近なイメージで考えることが理解への近道です。

 排他制御のポイントは、下記の3つです。

  1. 競合状態を防ぐ:共有資源にアクセスする間はロックを掛け、他の処理を排除する
  2. 必ずアンロックする:例外などが発生しても、ロックが確実に開放できるように設計する
  3. タイムアウトを設定する:ロックの開放漏れが起きても無限に待ち続けないように、一定時間ロックが開放されない場合はエラーとして処理する

 なお、今回紹介した例は、「誰かが使っている間は、他の読み書きを一切禁止する」という最もシンプルなケースです。実際のシステム開発では、読み込みは複数の処理で同時に許可しつつ、書き込み時だけ排他制御を行う手法を使うことが多くあります。

 今回は排他制御をトイレに例えて解説しましたが、身の回りにある「みんなで共有して使うもの」に注目してみると、他にもたくさんの面白い例えが見つかるはずです。ぜひ、自分なりの例えを探しながら、理解を深めてみてください。

山浦先生執筆の書籍が販売中です!

 本連載で取り上げた「ソフトウェア技術者のためのバグ百科事典」を大幅に加筆、修正した山浦恒央先生の書籍「ソフトウェア技術者のためのバグ検出テキスト」が日科技連出版から好評発売中です。連載でも取り上げた、「要求仕様書のバグ」「実装抜けのバグ」「テスト業務のバグ」など、バグを36種類に分類して解説しています。囲碁や将棋であれば、「相掛かり」「矢倉」「四間飛車」「藤井システム」のような戦法を網羅した内容になっています。

 前著「ソフトウェア技術者のためのバグ検出ドリル」(2019年11月刊行)も好評発売中です。実際にバグを含む要求仕様書、設計書、コーディング、デバッグ、保守を具体的に取り上げ、練習問題として31問を出題しました。同書は、囲碁や将棋における「次の一手」的な問題であり、ピンポイントの場面を取り上げ、実践力を鍛えることを目的としています。

ソフトウェア技術者のためのバグ検出テキストソフトウェア技術者のためのバグ検出ドリル 画像クリックで出版社のWebサイトへ

 両書とも興味のある方は、Amazon.comや書店でチェックしてください!

【 筆者紹介 】
山浦 恒央(やまうら つねお)

人間環境大学 環境情報学科 教授(工学博士)


1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。2025年4月より、人間環境大学環境情報学科教授。

主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

特別協賛PR
スポンサーからのお知らせPR
Pickup ContentsPR
Special SitePR
あなたにおすすめの記事PR