# FreeRTOS Semaphore & Mutex ## Semaphores - 用來讓一個 task 喚醒喚醒(wake)另一個 task 前面利用 Lock 這種互斥鎖,來達到共用資源的同步。接下來,來討論非排他鎖(nonexclusive locking) 的同步機制 Semaphore。 回到慣例,在開始之前,還是先來看個現實的例子。 :::info 有一個位於辦公大樓旁的平面停車場,該停車場擁有五十個車位。 一到上班時間,車輛就會開始湧入停車場。車輛進場時,管理員會給車輛一張停車證。離場時,依停車證繳費離場。 一但車位己滿,停車場的管理員禁止其他車輛入場。讓它們在門口等待。直到有車輛離場,空出車位後,才會再次放行。 從上面的例子中,可以觀察到幾個重點,這幾點正好可以說明 semaphore 的概念。 容量限制:停車場的容量上限是 50。 數量記數:車輛進場後,使用停車證做為記號;反之,離場時,必須繳回停車證。 出入管控;車位己滿,禁止車輛入場。反之,有車位,就允許車輛進入。 ::: ## Mutexes - 用來對共享資源(critical section)做互斥存取 防止兩條執行緒同時對同一公共資源(比如全域變數)進行讀寫的機制。該目的通過將代碼切片成一個一個的臨界區域(critical section)達成 :::info 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
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.