---
# System prepended metadata

title: FreeRTOS Semaphore & Mutex

---

# 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