セマフォは使用可能な資源数を管理します。wait()で取得し、signal()で返します。0なら資源が戻るまで待ちます。
3台分の駐車場シミュレータ
Sで3台分の空きを管理
S =3空き台数
到着を繰り返して満車にし、駐車中の車を押して退出させてください。
wait()とsignal()
S>0なら減らして進み、0なら待ちます。signal()は資源を返して待機者を起こします。起きた車が直ちに使う場合、Sは0のままです。
5枠の生産者・消費者バッファ
emptyとfullで5枠を管理
生産者
empty 5full 0
消費者
生産が速いと満杯になって生産者が停止し、消費が速いと消費者が待機します。
生産者・消費者問題
投入には空き、取出しにはデータが必要です。emptyとfullで条件を守り、バッファ自体の同時操作はミューテックスで保護します。
生産者:wait(empty)→lock(m)→投入→unlock(m)→signal(full)。消費者:wait(full)→lock(m)→取出し→unlock(m)→signal(empty)。
ミューテックスとの違い
セマフォには所有者がなく、別スレッドからsignal()できます。資源数だけでなくイベント通知にも使います。FreeRTOSの割込みから xSemaphoreGiveFromISR()でタスクを起こすのが一例です。