搜尋
首頁常見問題信號量和互斥量的差別是什麼

信號量和互斥量的差別是什麼

Nov 08, 2021 pm 02:24 PM
互斥量信號量執行緒

區別:1.互斥量用於執行緒的互斥,信號量用於執行緒的同步;2、互斥量值只能為0或1,訊號量值可以為非負整數; 3.互斥量的加鎖和解鎖必須由同一執行緒分別對應使用,訊號量可以由一個執行緒釋放,另一個執行緒得到。

信號量和互斥量的差別是什麼

本教學操作環境:windows7系統、Dell G3電腦。

互斥量和信號量的差異

1. 互斥量用於執行緒的互斥,訊號量用於執行緒的同步。

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

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

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

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

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

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

互斥量(Mutex)

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

信號量和互斥量的差別是什麼

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

Mutex可以抽象化為四個動作:

- 建立Create

#- 加鎖Lock

- 解鎖Unlock

-銷毀Destroy

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

不同作業系統中提供的Mutex函數:

死鎖主要發生在有多個依賴鎖存在時, 會在一個線程試圖以與另一個線程相反順序鎖住互斥量時發生. 如何避免死鎖是使用互斥量應該格外注意的東西。

  總體來講, 有幾個不成文的基本原則:

  對共享資源操作前一定要獲得鎖。

  完成作業以後一定要釋放鎖定。

  盡量短暫地佔用鎖。

  如果有多鎖, 如獲得順序是ABC連環扣, 釋放順序也應該是ABC。

  執行緒錯誤返回時應該釋放它所獲得的鎖定。

也許還有讀者好奇,「掛起等待」和「喚醒等待執行緒」的操作如何實現?每個Mutex有一個等待佇列,一個執行緒要在Mutex上掛起等待,先在把自己加入等待佇列中,然後置執行緒狀態為睡眠,然後呼叫調度器函數切換到別的執行緒。一個線程要喚醒等待隊列中的其它線程,只需從等待隊列中取出一項,把它的狀態從睡眠改為就緒,加入就緒隊列,那麼下次調度器函數執行時就有可能切換到被喚醒的線程。

一般情況下,如果同一個執行緒先後兩次呼叫lock,在第二次呼叫時,由於鎖已經被佔用,該執行緒會掛起等待別的執行緒釋放鎖,然而鎖正是被自己佔據著的,該線程又被掛起而沒有機會釋放鎖,因此就永遠處於掛起等待狀態了,這叫做死鎖(Deadlock)。另一種典型的死鎖情形是這樣:線程A獲得了鎖1,線程B獲得了鎖2,這時線程A調用lock試圖獲得鎖2,結果是需要掛起等待線程B釋放鎖2,而這時線程B也呼叫lock試圖獲得鎖1,結果是需要掛起等待線程A釋放鎖1,於是線程A和B都永遠處於掛起狀態了。不難想像,如果涉及到更多的線程和更多的鎖,有沒有可能死鎖的問題將會變得複雜和難以判斷。

信號量

信號量(Semaphore),有時被稱為信號燈,是在多線程環境下使用的一種設施, 它負責協調各個線程,以確保它們能夠正確、合理的使用公共資源。

訊號量可分為幾類:

  • 二進位訊號量(binary semaphore):只允許訊號量取0或1值,同時只能被一個線程獲取。

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

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

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

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

Semaphore可以抽象化成五個運算:

  • - 建立Create

  • - 等待Wait:

    線程等待信號量,如果值大於0,則獲得,值減一;如果只等於0,則一直線程進入睡眠狀態,知道信號量值大於0或超時。

  • -釋放 Post

    執行釋放信號量,則值加一;如果此時有正在等待的線程,則喚醒該線程。

  • -試圖等待TryWait

    如果呼叫TryWait,執行緒並不真正的去獲得信號量,還是檢查信號量是否能夠被獲得,如果信號量值大於0,則TryWait返回成功;否則返回失敗。

  • -銷毀 Destroy

信號量,是可以用來保護兩個或多個關鍵程式碼段,這些關鍵程式碼段不能並發呼叫。在進入一個關鍵程式碼段之前,執行緒必須取得一個信號量。如果關鍵程式碼段中沒有任何線程,那麼線程會立即進入該框圖中的那個部分。一旦該關鍵程式碼段完成了,那麼該執行緒必須釋放信號量。其它想進入該關鍵程式碼段的線程必須等待直到第一個線程釋放信號量。為了完成這個過程,需要建立一個訊號量,然後將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關鍵程式碼段的首端。確認這些信號量VI引用的是初始建立的信號量。

#動作/系統

Win32

Linyx

Solaris

建立

CreateMutex

pthread_mutex_init

mutex_init

#加鎖

WaitForSingleObject

#pthread_mutex_lock

##mutex_lock

#解鎖

ReleaseMutex

pthread_mutex_unlock

mutex_unlock

銷毀

#CloseHandle

pthread_mutex_destroy

mutex_destroy

動作/系統

#Win32

POSIX

建立

CreateSemaphore

sem_init

#等待

WaitForSingleObject

sem _wait

釋放

ReleaseMutex

#sem _post

##試圖等待

WaitForSingleObject

sem _trywait

銷毀

CloseHandle

sem_destroy

更多相關知識,請訪問

常見問題專欄!

以上是信號量和互斥量的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
deepseek網頁版官方入口deepseek網頁版官方入口Mar 12, 2025 pm 01:42 PM

國產AI黑馬DeepSeek強勢崛起,震撼全球AI界!這家成立僅一年半的中國人工智能公司,憑藉其免費開源的大模型DeepSeek-V3和DeepSeek-R1,在性能上與OpenAI等國際巨頭比肩,甚至在成本控制方面實現了突破性進展,贏得了全球用戶的廣泛讚譽。 DeepSeek-R1現已全面上線,性能媲美OpenAIo1正式版!您可以在網頁端、APP以及API接口體驗其強大的功能。下載方式:支持iOS和安卓系統,用戶可通過應用商店下載;網頁版也已正式開放! DeepSeek網頁版官方入口:ht

deepseek服務器繁忙怎麼解決deepseek服務器繁忙怎麼解決Mar 12, 2025 pm 01:39 PM

DeepSeek:火爆AI遭遇服務器擁堵,如何應對? DeepSeek作為2025年開年爆款AI,免費開源且性能媲美OpenAIo1正式版,其受歡迎程度可見一斑。然而,高並發也帶來了服務器繁忙的問題。本文將分析原因並提供應對策略。 DeepSeek網頁版入口:https://www.deepseek.com/DeepSeek服務器繁忙的原因:高並發訪問:DeepSeek的免費和強大功能吸引了大量用戶同時使用,導致服務器負載過高。網絡攻擊:據悉,DeepSeek對美國金融界造成衝擊,

深度求索deepseek官網入口深度求索deepseek官網入口Mar 12, 2025 pm 01:33 PM

2025年開年,國產AI“深度求索”(deepseek)驚艷亮相!這款免費開源的AI模型,性能堪比OpenAI的o1正式版,並已在網頁端、APP和API全面上線,支持iOS、安卓和網頁版多端同步使用。深度求索deepseek官網及使用指南:官網地址:https://www.deepseek.com/網頁版使用步驟:點擊上方鏈接進入deepseek官網。點擊首頁的“開始對話”按鈕。首次使用需進行手機驗證碼登錄。登錄後即可進入對話界面。 deepseek功能強大,可進行代碼編寫、文件讀取、創

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能