ミューテックスは鍵が1つのロックです。所有者だけが保護対象に入り、他のスレッドは解放を待ちます。
3スレッドのロックと待機列
各スレッドでlock()とunlock()を実行
クリティカルセクション
所有者がいると他は待機します。この例では解放すると列の先頭が取得します。
ミューテックスには所有者がある
取得したスレッドが解放する規則です。他スレッドからの解放は実装によってエラーなどになります。二値セマフォには所有者がなく、別スレッドから通知できます。
優先度逆転と継承の時間軸
HがLのミューテックスを待つ例
実行中(H、M、L)
ロック待ち
実行可能
継承優先度で実行
継承の有無でHの終了時刻を比較してください。
優先度逆転
LのロックをHが待っている間にMがLを中断すると、Lは解放できません。その結果、高優先度HもMの終了を待たされます。
1997年の火星探査機Pathfinderの繰返しリセットも、この現象が原因でした。
優先度継承
HがLを待つとLの優先度を一時的に上げます。Mの割込みを防いで解放を早め、解放後は元に戻します。
FreeRTOSでは xSemaphoreCreateMutex()によるミューテックスに継承があり、 xSemaphoreCreateBinary()による二値セマフォにはありません。共有資源保護ではこの違いが重要です。