【みゅーてっくす】

ミューテックス とは?

最終更新:
💡 共有データを使う間だけ、鍵を持つ

共有データを扱う区間に、同時に複数のスレッドが入らないようにする排他ロック。競合する処理が同じロックを正しく使うことが重要。ロックの取得・解放や順序を誤ると、更新の競合やデッドロックが残る。

📌 このページのポイント
ミューテックス:共有部分へ1つずつスレッドAロック取得スレッドB取得を待つ共有データ読み・更新・書くAが解放してからBも取得して入る競合する側も、同じロックを使う鍵があっても、使わない経路は守れないよ
取得できるまで待つロック操作の模式例。点線は待機を表します。待たずに試す操作や解放方法は、利用するAPIで確認します。
ひよこ ひよこ
ミューテックスって、何をするもの?
ペンギン先生 ペンギン先生
1人だけが鍵を持てる作業室を思い浮かべよう。共有データを使う区間へ入る前にロックを取得し、使い終えたら解放する。別のスレッドはその鍵を取得してから入る。データを自動で直す道具ではなく、同時に入らないための仕組みだよ。
ひよこ ひよこ
どんな更新が、ぶつかるの?
ペンギン先生 ペンギン先生
残高を読み、100円足し、書き戻す処理を2つ同時に行う例だよ。両方が同じ古い残高を読めば、一方の加算が上書きされる場合がある。読み取りから書き戻しまでの一連の処理を、同じロックで保護して順に行うんだ。
ひよこ ひよこ
片方にだけロックを付ければいい?
ペンギン先生 ペンギン先生
競合する側も同じロックを使う必要があるよ。ロックを無視してデータへ触る処理があれば、守る範囲をすり抜けてしまう。何を共有し、どの読み書きが競合するかを整理することが大切。ミューテックスを置いたというだけで、すべてが安全になるわけではないんだ。
ひよこ ひよこ
鍵を取れないと、ずっと待つの?
ペンギン先生 ペンギン先生
操作によるよ。RustのMutex::lockは取得できるまでスレッドを待たせるけれど、try_lockは待たずに試し、取得できなければ結果で知らせる。解放もRustではガードが破棄されるときに行うなど、APIによって扱いが違う。使う言語の資料を確認しよう。
ひよこ ひよこ
使うときの注意は?
ペンギン先生 ペンギン先生
保護する区間を必要な範囲にし、待ち続けない構成を考えよう。たとえば自分が持っている鍵をさらに取ろうとしたり、複数のロックを逆の順で取ったりすると、進まなくなる場合がある。解放の漏れやエラー時の扱いも含めて設計しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ミューテックス」って出てきたら「共有データを使う区間に、1つずつ入るための鍵」と思えばだいたいOK!
📖 おまけ:英語の意味
「Mutex / Mutual Exclusion」 = 相互排除
💬 Mutual Exclusionを縮めた呼び名だよ。複数の処理が同じ共有部分へ同時に入るのを防ぐんだ。

参考資料

← 用語集にもどる