【はいたせいぎょ】

排他制御(ミューテックス) とは?

💡 トイレの「使用中」ランプ――入ったらロック、出たら解除!
📌 このページのポイント
排他制御(ミューテックス)の仕組み スレッドA スレッドB ロック 取得済み 待機中 🚫 クリティカルセクション 共有データの操作 共有データ 残高: 1000円 ロック取得 → アクセス可 ブロック(待機) 保護区間
排他制御のイメージ
ひよこ ひよこ

排他制御って何? なんだか怖そうな名前だけど…

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

全然怖くないよ!トイレの「使用中」ランプをイメージしてみて。誰かが入ったらランプが点いて、他の人は待つよね。それと同じで、あるデータを1人だけが操作できるようにする仕組みだよ

ひよこ ひよこ

排他制御しないとどうなるの?

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

例えば銀行口座の残高が1000円のとき、AさんとBさんが同時に500円引き出そうとすると、両方とも「残高1000円あるからOK」と判断して合計1000円引き出せちゃう。残高がマイナスになって大問題だよね。これがレースコンディションと呼ばれる不具合だよ

ひよこ ひよこ

どうやって排他制御するの?

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

一番シンプルなのがミューテックス(mutex)だよ。スレッドリソースを使う前にロックを取得して、使い終わったらロックを解放する。ロック中に別のスレッドが来たら、解放されるまで待ってもらうんだ

ひよこ ひよこ

ミューテックス以外にも方法があるの?

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

セマフォは同時にN個までアクセスを許可できる仕組みだよ。ミューテックスはN=1のセマフォとも言えるね。他にもモニタやスピンロック、読み書きロックなど、状況に応じた方法がたくさんあるよ

ひよこ ひよこ

排他制御って使いすぎると問題になったりしないの?

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

いいところに気づいたね!ロックを広範囲にかけすぎると、他のスレッドがずっと待たされて性能がガタ落ちする。逆にロックの範囲が狭すぎると不整合が起きる。さらに、複数のロックを取る順番を間違えるとデッドロックという永久に待ち続ける状態になるから、設計がとても大事だよ

ひよこ ひよこ

プロのエンジニアでも間違えることがあるの?

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

しょっちゅうあるよ!並行プログラミングのバグはテストでも再現しにくくて、本番環境で突然発生することがある。最近ではRustのように言語レベルでデータ競合を防ぐ仕組みを持つ言語も登場していて、排他制御の正しさをコンパイル時にチェックできるようになってきているんだ

ひよこ ひよこ

言語が守ってくれるなんて心強いね!

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

そうだね。ただどの言語を使うにしても、排他制御の基本概念を理解しておくことが大切だよ。「最小限のロック範囲」「ロックの取得順序を統一する」「できるだけイミュータブルなデータを使う」という3つの原則を覚えておくといいよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
排他制御って出てきたら「同時に触ると壊れるから1人ずつ順番にアクセスさせる仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Mutual Exclusion」 = 相互排除
💬 Mutual(お互いの)+ Exclusion(排除)で「お互いに同時には入れない」という意味だよ
← 用語集にもどる