互斥量和信號量的區別
來源 https://www.cnblogs.com/lbsx/archive/2009/08/03/1537698.html
1. 互斥量用於線程的互斥,信號量用於線程的同步。
這是互斥量和信號量的根本區別,也就是互斥和同步之間的區別。
互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。
同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源
以上區別是主要想記住的。
note:信號量可以用來實現互斥量的功能
2. 互斥量值只能為0/1,信號量值可以為非負整數。
也就是說,一個互斥量只能用於一個資源的互斥訪問,它不能實現多個資源的多線程互斥問題。信號量可以實現多個同類資源的多線程互斥和同步。當信號量為單值信號量是,也可以完成一個資源的互斥訪問。
3. 互斥量的加鎖和解鎖必須由同一線程分別對應使用,信號量可以由一個線程釋放,另一個線程得到。
鏈接:https://www.zhihu.com/question/47704079/answer/136200849
Mutex 相比信號量增加了所有權的概念,一只鎖住的 Mutex 只能由給它上鎖的線程解開,只有系鈴人才能解鈴。Mutex 的功能也就因而限制在了構造臨界區上。
一元信號量則可以由任一線程解開。這樣多出來的一份語義,就是解決讀者-寫者問題的工具。比如某進程讀取磁盤並進入睡眠,等待中斷讀取盤塊結束之后來喚醒它。這就是可以祭出一元信號量的一個情景,而 Mutex 是解決不了的。『信號量』 這個詞本身來自火車站的信號燈,其實本來就暗含着一層 『通知』 的含義。
『同步』這個詞也可以拆開看,一側是等待數據的『事件』或者『通知』,一側是保護數據的 『臨界區』。信號量可以滿足這兩個功能,但是可以注意到兩個功能的應用場景還是蠻大的,有 do one thing and do it best 的空間。linux 內核曾將 semaphore 作為同步原語,后面代碼變得較難維護,刷了一把 mutex 變簡單了不少還變快了,需要『通知』 的場景則替換為了 completion variable。
Difference between completion variables and semaphores
How are mutexes and semaphores different with respect to their implementation in a Linux kernel?
Some facts on mutex in Linux.
- only one task can hold the mutex at a time
- only the owner can unlock the mutex (unlike the semaphore)
- multiple unlocks are not permitted
- recursive locking is not permitted (since here count can be maximum 1 unlike the semaphore where for e.g count = 5)
- task may not exit with mutex held
- memory areas where held locks reside must not be free
- mutexes may not be used in hardware or software interrupt contexts such as tasklets and timers
============== End