【モニタ】

モニタ(同期機構) とは?

💡 受付つきの面談室――入れるのは1人、呼ばれるまで待合室で待機!
📌 このページのポイント
モニタ(同期機構)の仕組み 入口キュー スレッド1 スレッド2 スレッド3 enter モニタ 共有データ 排他制御済み 操作手続き put() / get() 条件変数の待ちキュー wait() signal()で起床 exit 処理完了 ロック解放 排他制御(自動) wait(条件待ち) 条件変数キュー
モニタ(同期機構)のイメージ
ひよこ ひよこ

モニタって画面のモニターとは違うの?

ペンギン先生 ペンギン先生

全然違うよ!並行プログラミングのモニタは、共有データを安全に操作するための仕組みなんだ。面談室をイメージしてみて。中に入れるのは1人だけで、受付が管理してくれる。それがモニタの役割だよ

ひよこ ひよこ

ミューテックスとどう違うの?

ペンギン先生 ペンギン先生

ミューテックスは「鍵」だけの仕組みだけど、モニタは「鍵+待合室」がセットになっているんだ。例えばバッファが空のときに消費者が来たら、「データが入るまで待合室で待っていてね」と言える。これが条件変数(Condition Variable)という機能だよ

ひよこ ひよこ

条件変数ってどう使うの?

ペンギン先生 ペンギン先生

waitとsignal(またはnotify)の2つの操作があるよ。waitを呼ぶと「条件が満たされるまで待合室に入る」、signalを呼ぶと「待合室の人を1人起こす」という動作になるんだ。生産者-消費者問題の実装でよく使われるよ

ひよこ ひよこ

Javaで見たことあるsynchronizedってモニタなの?

ペンギン先生 ペンギン先生

その通り!Javaのsynchronizedブロックはまさにモニタの実装なんだ。すべてのオブジェクトが暗黙的にモニタを持っていて、synchronizedで排他制御、wait()とnotify()で条件同期ができるよ

ひよこ ひよこ

モニタってすごく便利そうだけど、弱点はないの?

ペンギン先生 ペンギン先生

モニタは1つのプロセス内でしか使えないから、複数のマシンにまたがる分散システムでは使えないんだ。あと、signalを呼んだ直後に起きたスレッドがすぐ実行されるとは限らないから、条件の再チェック(whileループ)が必要だよ

ひよこ ひよこ

whileループで再チェックするのはなぜ?

ペンギン先生 ペンギン先生

これは「スプリアスウェイクアップ」という現象があるからなんだ。signalを送っていないのにwaitから目覚めることがあるし、目覚めてからロックを取得するまでの間に別のスレッドが条件を変えてしまうこともある。だからif文ではなくwhileループで条件を再確認するのがモニタの鉄則だよ

ひよこ ひよこ

奥が深いんだね!

ペンギン先生 ペンギン先生

そうだね。モニタはC.A.R.ホーアが1974年に提案した歴史ある概念で、今でもJavaC#Pythonなど多くの言語に影響を与えているよ。セマフォより安全に書けるから、実務ではモニタベースの同期を使うことが多いんだ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
モニタ(同期機構)って出てきたら「排他制御と条件待ちをセットにした便利な並行制御の仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Monitor」 = 監視・管理する仕組み
💬 「監視して管理する」という意味のMonitorが由来で、共有データへのアクセスを管理してくれるから「モニタ」と呼ばれるようになったんだよ
← 用語集にもどる