Try   HackMD

FreeRTOS Semaphore & Mutex

Semaphores - 用來讓一個 task 喚醒喚醒(wake)另一個 task

前面利用 Lock 這種互斥鎖,來達到共用資源的同步。接下來,來討論非排他鎖(nonexclusive locking) 的同步機制 Semaphore。

回到慣例,在開始之前,還是先來看個現實的例子。

有一個位於辦公大樓旁的平面停車場,該停車場擁有五十個車位。

一到上班時間,車輛就會開始湧入停車場。車輛進場時,管理員會給車輛一張停車證。離場時,依停車證繳費離場。

一但車位己滿,停車場的管理員禁止其他車輛入場。讓它們在門口等待。直到有車輛離場,空出車位後,才會再次放行。
從上面的例子中,可以觀察到幾個重點,這幾點正好可以說明 semaphore 的概念。

容量限制:停車場的容量上限是 50。
數量記數:車輛進場後,使用停車證做為記號;反之,離場時,必須繳回停車證。
出入管控;車位己滿,禁止車輛入場。反之,有車位,就允許車輛進入。

Mutexes - 用來對共享資源(critical section)做互斥存取

防止兩條執行緒同時對同一公共資源(比如全域變數)進行讀寫的機制。該目的通過將代碼切片成一個一個的臨界區域(critical section)達成

Mutex比較像是整個部門共用一箱文具,當A同事在使用文具箱內的釘書機的時候,其他人就無法使用釘書機,必須等A同事把釘書機還到工具箱中,其他同事才可以使用此釘書機。
文具箱:thread共用記憶體空間
釘書機:臨界區域(critical section)

面試題:Mutex 與Semaphore 最大的差異是?
最大的差異在於Mutex 只能由上鎖的thread 解鎖,而Semaphore 沒有這個限制,可以由原本的thread 或是另外一個thread 解開。另外,Mutex 只能讓一個thread 進入critical section,Semaphore 的話則可以設定要讓幾個thread 進入。這讓實際上使用Mutex 跟Semaphore 場景有很大的差別。

queue實作semaphore

queue實作mutex