訊號量和互斥量(鎖)的區別

2021-10-11 22:07:32 字數 2261 閱讀 9706

訊號量:那是多執行緒同步用的,乙個執行緒完成了某乙個動作就通過訊號告訴別的執行緒,別的執行緒再進行某些動作。

互斥量:這是多執行緒互斥用的,比如說,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,知道這個執行緒離開,其他的執行緒才開始可以利用這個資源。

訊號量與普通整型變數的區別:

訊號量(semaphore)是非負整型變數,除了初始化之外,它只能通過兩個標準原子操作:wait(semap), signal(semap) ; 來進行訪問;原子操作操作也被成為pv原語(p**於dutchproberen"測試",v**於dutchverhogen"增加"),而普通整型變數則可以在任何語句塊中被訪問;

訊號量與互斥量之間的區別:

1 互斥量用於執行緒的互斥,訊號線用於執行緒的同步。 這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。

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

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

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

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

3互斥量的加鎖和解鎖必須由同一執行緒分別對應使用,訊號量可以由乙個執行緒釋放,另乙個執行緒得到。

【附】訊號量與互斥量詳細分析

訊號量(semaphore)

訊號量,有時也稱為訊號燈,是在多執行緒環境下使用的一種設施, 它負責協調各個執行緒, 以保證它們能夠正確、合理的使用公共資源。

訊號量可以分為幾類:

二進位制訊號量(binarysemaphore):只允許訊號量取0或1值,其同時只能被乙個執行緒獲取。

整型訊號量(integersemaphore):訊號量取值是整數,它可以被多個執行緒同時獲得,直到訊號量的值變為0。

記錄型訊號量(recordsemaphore):每個訊號量s除乙個整數值value(計數)外,還有乙個等待佇列list,其中是阻塞在該訊號量的各個執行緒的標識。當訊號量被釋放乙個,值被加一後,系統自動從等待佇列中喚醒乙個等待中的執行緒,讓其獲得訊號量,同時訊號量再減一。

訊號量通過乙個計數器控制對共享資源的訪問,訊號量的值是乙個非負整數,所有通過它的執行緒都會將該整數減一。如果計數器大於0,則訪問被允許,計數器減1;如果為0,則訪問被禁止,所有試圖通過它的執行緒都將處於等待狀態。

計數器計算的結果是允許訪問共享資源的通行證。因此,為了訪問共享資源,執行緒必須從訊號量得到通行證, 如果該訊號量的計數大於0,則此執行緒獲得乙個通行證,這將導致訊號量的計數遞減,否則,此執行緒將阻塞直到獲得乙個通行證為止。當此執行緒不再需要訪問共享資源時,它釋放該通行證,這導致訊號量的計數遞增,如果另乙個執行緒等待通行證,則那個執行緒將在那時獲得通行證。

semaphore可以被抽象為五個操作:

-建立create

-等待 wait: 執行緒等待訊號量,如果值大於0,則獲得,值減一;如果只等於0,則一直執行緒進入睡眠狀態,知道訊號量值大於0或者超時。

-釋放 post:執行釋放訊號量,則值加一;如果此時有正在等待的執行緒,則喚醒該執行緒。

-試圖等待trywait:如果呼叫trywait,執行緒並不真正的去獲得訊號量,還是檢查訊號量是否能夠被獲得,如果訊號量值大於0,則trywait返回成功;否則返回失敗。

-銷毀destroy

互斥量(mutex)

互斥量表現互斥現象的資料結構,也被當作二元訊號燈。乙個互斥基本上是乙個多工敏感的二元訊號,它能用作同步多工的行為,它常用作保護從中斷來的臨界段**並且在共享同步使用的資源。

mutex本質上說就是一把鎖,提供對資源的獨佔訪問,所以mutex主要的作用是用於互斥。mutex物件的值,只有0和1兩個值。這兩個值也分別代表了mutex的兩種狀態。值為0, 表示鎖定狀態,當前物件被鎖定,使用者程序/執行緒如果試圖lock臨界資源,則進入排隊等待;值為1,表示空閒狀態,當前物件為空閒,使用者程序/執行緒可以lock臨界資源,之後mutex值減1變為0。

mutex可以被抽象為四個操作:

-建立create

-加鎖 lock

-解鎖unlock

-銷毀destroy

mutex被建立時可以有初始值,表示mutex被建立後,是鎖定狀態還是空閒狀態。在同乙個執行緒中,為了防止死鎖,系統不允許連續兩次對mutex加鎖(系統一般會在第二次呼叫立刻返回)。也就是說,加鎖和解鎖這兩個對應的操作,需要在同乙個執行緒中完成。

訊號量和互斥鎖的區別

參考部落格 訊號量與互斥鎖的主要不同在於 燈 的概念,燈亮則意味著資源可用,燈滅則意味著不可用。訊號量 除了燈亮 燈滅這種二元燈以外,也可以採用大於1的燈數,以表示資源數大於1,這時可以稱之為多元燈 而互斥鎖只能是燈亮 燈滅這種二元燈,用於表明資源是可用,還是不可用。互斥量和訊號量的區別 1.互斥量...

訊號量和互斥鎖

概念 訊號量用在多執行緒多工 同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在sem wait的時候,就阻塞在那裡 互斥鎖是用在多執行緒多工 互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法訪問,直到這個執行緒unlock,其他的執行緒才開始可...

訊號量,互斥鎖

注 摘自 程式設計師的自我修養 相關章節。關鍵字 執行緒同步 原子操作 鎖 二元訊號量 訊號量 互斥量 臨界區 讀寫鎖 條件變數 原子操作 共享資料 全域性變數或堆變數 的自增 操作在多執行緒環境下會出現錯誤是因為這個操作 一條c語句 被編譯為彙編 後不止一條指令,因此在執行的時候可能執行了一半就被...