ミューテックスとセマフォの違い:排他制御と同期を比較
ミューテックスは、臨界区間を守り、共有の資源を同時に使えるスレッドを1つだけにします。ロックしたスレッドが、アンロックもしなければなりません。セマフォはカウンタで、限りのある資源を同時に使えるスレッドの数を制御し、あるスレッドから別のスレッドへの、イベントの通知にも使えます。ミューテックスは所有と排他、セマフォは数えることと通知のための仕組みです。
| 項目 | ミューテックス | セマフォ |
|---|---|---|
| 目的 | 排他制御。臨界区間に入れるのは同時に1つのスレッドだけ | 計数。N個の資源のプールへのアクセスを制限する、またはスレッド間でイベントを通知する |
| 値 | ロック中かアンロックか(2値) | 0以上の整数のカウント(0または1だけの場合が、バイナリセマフォ) |
| 所有者 | ロックしたスレッドが持ち、そのスレッドがアンロックするべき | 所有者はいない。どのスレッドでもポストやシグナルを出せる |
| 操作 | ロックとアンロック | ウェイト(P、減らす)とポスト(V、増やす) |
| スレッド間のシグナル | 想定していない | 使える。たとえば、生産者が消費者へ知らせる |
| 優先度逆転 | 優先度継承で避けられることが多い | 通常は対応していない |
| 主な用途 | リストやカウンタなど、共有のデータ構造を守る | 接続プールの制限、容量に限りのある生産者・消費者のバッファ、割り込みハンドラからタスクへの通知 |
| よくある落とし穴 | ロックの順序が一定でないことによるデッドロック、アンロックの忘れ | カウントが合わないことによる、シグナルの取りこぼしとデッドロック |
数値は代表的な目安で、世代や製品によって異なります。