【はいたせいぎょ】

排他制御(並行処理) とは?

最終更新:
💡 トイレの「使用中」ランプ――入ったらロック、出たら解除!

排他制御は、同時に操作されると不整合が起きる共有データや処理について、一度に一つの実行主体だけが扱えるようにする考え方。ミューテックスなどを使い、必要な処理のまとまりを保護する。

📌 このページのポイント
排他制御:共有データを一つずつスレッドA取得中保護対象読み取り・更新スレッドB解放を待つ同じロックを使うAが終わって解放すると、Bも取得できる
ミューテックスを使う一例です。同じ保護対象を扱う側どうしで、取得・解放の規則を揃えます。
ひよこ ひよこ
排他制御って何? なんだか怖そうな名前だけど…
ペンギン先生 ペンギン先生
トイレの鍵をイメージしてみよう。誰かが使う間はほかの人が入れず、出るときに鍵を戻すよね。同じように、共有データについて、必要な処理を同時に行わせない考え方だよ。
ひよこ ひよこ
同時に触ると、どんな問題があるの?
ペンギン先生 ペンギン先生
たとえば値0をAとBがそれぞれ読んで、1を足して書き戻すとしよう。両方が先に0を読むと、それぞれ1を書き、2回足したはずなのに結果は1になる。読み取りから更新までを一つのまとまりとして守る必要があるんだ。
ひよこ ひよこ
ミューテックスを使えばよい?
ペンギン先生 ペンギン先生
方法の一つだよ。ロックを取得して保護対象を扱い、終わったら解放する。同じ対象を扱う側どうしで、同じロックを使う必要がある。ロックを取らずに書き換える処理があれば、その操作まで自動で守られるわけではないんだ。
ひよこ ひよこ
セマフォを1にすれば、ミューテックスと同じ?
ペンギン先生 ペンギン先生
一つだけ通す用途には使えるけれど、所有者や解放の規則などが異なるよ。たとえば.NETのMutexは取得したスレッドが解放し、Semaphoreは同じスレッドに限定しない。道具の性質を確認して選ぼう。
ひよこ ひよこ
ロックがあれば、どんな不具合も防げる?
ペンギン先生 ペンギン先生
保護する範囲やロックの順序が不適切だと、待ち時間が増えたり、互いに待ち続けるデッドロックが起きたりするよ。Rustにもデッドロックはあり得る。対象、取得と解放の経路、複数のロックの順序を設計することが大切だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「排他制御」って出てきたら「共有データを同時に触らせず、必要な処理を一つずつ行う仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Mutual Exclusion」 = 相互排除
💬 Mutualは相互、exclusionは排除。同じ保護対象の操作が同時に進まないようにする考え方で、ミューテックスはそのための道具の一つだよ。

参考資料

← 用語集にもどる