互斥量和信號量的區別


互斥量和信號量的區別

 

來源 https://www.cnblogs.com/lbsx/archive/2009/08/03/1537698.html

 

1. 互斥量用於線程的互斥,信號量用於線程的同步。

這是互斥量和信號量的根本區別,也就是互斥和同步之間的區別。

互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源

以上區別是主要想記住的。

note:信號量可以用來實現互斥量的功能

2. 互斥量值只能為0/1,信號量值可以為非負整數。

也就是說,一個互斥量只能用於一個資源的互斥訪問,它不能實現多個資源的多線程互斥問題。信號量可以實現多個同類資源的多線程互斥和同步。當信號量為單值信號量是,也可以完成一個資源的互斥訪問。

3. 互斥量的加鎖和解鎖必須由同一線程分別對應使用,信號量可以由一個線程釋放,另一個線程得到。

 

作者:fleuria  編輯於 2016-12-16
鏈接:https://www.zhihu.com/question/47704079/answer/136200849

Mutex 相比信號量增加了所有權的概念,一只鎖住的 Mutex 只能由給它上鎖的線程解開,只有系鈴人才能解鈴。Mutex 的功能也就因而限制在了構造臨界區上。

一元信號量則可以由任一線程解開。這樣多出來的一份語義,就是解決讀者-寫者問題的工具。比如某進程讀取磁盤並進入睡眠,等待中斷讀取盤塊結束之后來喚醒它。這就是可以祭出一元信號量的一個情景,而 Mutex 是解決不了的。『信號量』 這個詞本身來自火車站的信號燈,其實本來就暗含着一層 『通知』 的含義。

『同步』這個詞也可以拆開看,一側是等待數據的『事件』或者『通知』,一側是保護數據的 『臨界區』。信號量可以滿足這兩個功能,但是可以注意到兩個功能的應用場景還是蠻大的,有 do one thing and do it best 的空間。linux 內核曾將 semaphore 作為同步原語,后面代碼變得較難維護,刷了一把 mutex 變簡單了不少還變快了,需要『通知』 的場景則替換為了 completion variable。

Goodbye semaphores?

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
 
Linux kernel一直有提供兩大類鎖,busy wait的spinlock,和mutex或者semaphore,后者的實現里有地方會用到spinlock。最早時mutex只是一個binary semaphore的wrapper(兩三行的macro),語義上不保證只有持有者可以解鎖。2006年時如上面這個鏈接里的文檔所說正式引入了真正的mutex,semaphore成為了二等公民。
 

============== End

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM