儘管兩個概念有點類似,但是他們的側重點不一樣,
不難看出,mutex是semaphore的一種特殊情況(n=1時)。也就是說,完全可以用後者替代前者。但是,因為mutex較為簡單,且效率高,所以在必須保證資源獨佔的情況下,還是採用這種設計。
semaphore可以被抽象為五個操作:一般人不明白semaphore和mutex的區別,根本原因是不知道semaphore的用途。semaphore的用途,一句話:排程執行緒。有的人用semaphore也可以把某個資源「保護"起來以防止共享資源衝突,必須承認這是可行的,但是semaphore不是讓你用來做這個的;如果你要做這件事,請用mutex。1.建立 create,一般初始化乙個值n
2.等待 wait:執行緒等待訊號量,如果值大於0,則獲得,值減一;如果只等於0,則一直執行緒進入睡眠狀態,知道訊號量值大於0或者超時。
3.釋放 post:執行釋放訊號量,則值加一;如果此時有正在等待的執行緒,則喚醒該執行緒。
4.試圖等待 trywait:如果呼叫trywait,執行緒並不真正的去獲得訊號量,還是檢查訊號量是否能夠被獲得,如果訊號量值大於0,則trywait返回成功;否則返回失敗。
5.銷毀 destroy
訊號量,是可以用來保護兩個或多個關鍵**段,這些關鍵**段不能併發呼叫。在進入乙個關鍵**段之前,執行緒必須獲取乙個訊號量。如果關鍵**段中沒有任何執行緒,那麼執行緒會立即進入該框圖中的那個部分。一旦該關鍵**段完成了,那麼該執行緒必須釋放訊號量。其它想進入該關鍵**段的執行緒必須等待直到第乙個執行緒釋放訊號量。為了完成這個過程,需要建立乙個訊號量,然後將acquire semaphore vi以及release semaphore vi分別放置在每個關鍵**段的首末端。確認這些訊號量vi引用的是初始建立的訊號量。
在這裡,我模擬乙個最典型的使用semaphore的場景:a源自乙個執行緒,b源自另乙個執行緒,計算c = a + b也是乙個執行緒。(即一共三個執行緒)顯然,第三個執行緒必須等第
一、二個執行緒執行完畢它才能執行。在這個時候,我們就需要排程執行緒了:讓第
一、二個執行緒執行完畢後,再執行第三個執行緒。此時,就需要用semaphore了。
int a, b, c;
void
geta()
void
getb()
void
getc()
t1 =
thread_create
(geta)
;t2 =
thread_create
(getb)
;t3 =
thread_create
(getc)
;thread_join
(t3)
;// semaphore_increase對應sem_post
// semaphore_decrease對應sem_wait
簡而言之,鎖是服務於共享資源的;而semaphore是服務於多個執行緒間的執行的邏輯順序的。 訊號量與互斥鎖的區別
訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在semtake的時候,就阻塞在 互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,其他的執行緒才開始可以利用這個資源。...
訊號量與互斥鎖的區別
之前遇到乙個問題,訊號量和互斥鎖的區別是什麼。一時忘了思考,今天才想到這個問題,翻閱知乎和stackoverflow,理解了之後做簡單整理 mutex,互斥鎖,用於序列化對一部分可重入 的訪問,這些 不能由多個執行緒同時執行 semaphore,訊號量,將共享資源的併發使用者數限制為最大數量 mut...
訊號量與互斥鎖
訊號量與普通整型變數的區別 訊號量 semaphore 是非負整型變數,除了初始化之外,它只能通過兩個標準原子操作 wait semap signal semap 來進行訪問 操作也被成為pv原語 p 於dutch proberen 測試 v 於 dutch verhogen 增加 而普通整型變數則...