目錄
互斥量和信號量的差異
互斥量(Mutex)
信號量
首頁 常見問題 信號量和互斥量的差別是什麼

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

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

8核16線程是什麼意思? 8核16線程是什麼意思? Feb 02, 2023 am 11:26 AM

8核是指CPU有8顆物理核心,16線程是指CPU最多同時可以有16個執行緒處理任務。核心數和執行緒數是電腦CPU的重要效能指標,CPU的核心數越高處理速度就越高;執行緒數越多越有利於同時運行多個程序,因為執行緒數等同於在某個瞬間CPU能同時並行處理的任務數。多執行緒可最大限度地實現寬發射、亂序的超標量處理,提高處理器運算元件的使用率,緩和由於資料相關或Cache未命中帶來的存取記憶體延遲。

C++並發程式設計:如何避免執行緒飢餓和優先反轉? C++並發程式設計:如何避免執行緒飢餓和優先反轉? May 06, 2024 pm 05:27 PM

為避免執行緒飢餓,可以使用公平鎖確保資源公平分配,或設定執行緒優先權。為解決優先權反轉,可使用優先權繼承,即暫時提高持有資源執行緒的優先權;或使用鎖的提升,即提升需要資源執行緒的優先權。

PHP程式中的互斥最佳實踐 PHP程式中的互斥最佳實踐 Jun 07, 2023 pm 12:40 PM

隨著時代的進步和技術的不斷更新,Web應用程式的需求越來越大,而PHP程式成為了許多Web應用程式的主要程式語言之一。在一個多執行緒的Web應用程式中,必須考慮到並發性和競態條件,以確保程式的正確運作。在PHP程式中,互斥量提供了一種解決方案,以確保線程安全和資料傳輸的準確性。在本文中,我們將探討PHP程式中的互斥量最佳實務。什麼是互斥?互斥量是用來確保線程

C++並發程式設計:如何進行執行緒終止和取消? C++並發程式設計:如何進行執行緒終止和取消? May 06, 2024 pm 02:12 PM

C++中執行緒終止和取消機制包括:執行緒終止:std::thread::join()阻塞目前執行緒直到目標執行緒完成執行;std::thread::detach()從執行緒管理中分離目標執行緒。執行緒取消:std::thread::request_termination()請求目標執行緒終止執行;std::thread::get_id()取得目標執行緒ID,可與std::terminate()一起使用,立即終止目標執行緒。實戰中,request_termination()允許執行緒決定終止時機,join()確保在主線

go語言中協程與執行緒的差別是什麼 go語言中協程與執行緒的差別是什麼 Feb 02, 2023 pm 06:10 PM

區別:1、一個執行緒可以多個協程,一個行程也可以單獨擁有多個協程;2、執行緒是同步機制,而協程則是異步;3、協程能保留上一次呼叫時的狀態,執行緒不行;4、執行緒是搶佔式,協程是非搶佔式的;5、執行緒是被分割的CPU資源,協程是組織好的程式碼流程,協程需要執行緒來承載運作。

什麼是程式運行時指令流的最小單位 什麼是程式運行時指令流的最小單位 Aug 23, 2022 pm 02:16 PM

「執行緒」是程式運行時指令流的最小單位。進程是指一個具有一定獨立功能的程序,而執行緒是進程的一部分,描述指令流執行狀態;執行緒是進程中的指令執行流的最小單位,是CPU調度的基本單位。一個執行緒是一個任務(一個程式段)的一次執行過程;執行緒不佔有記憶體空間,它包括在一個行程的記憶體空間中。在同一個行程內,多個執行緒共享行程的資源;一個行程至少有一個執行緒。

Java錯誤:JavaFX線程卡頓錯誤,如何處理和避免 Java錯誤:JavaFX線程卡頓錯誤,如何處理和避免 Jun 24, 2023 pm 05:52 PM

在進行JavaFX應用程式開發的過程中,我們常常會遇到JavaFX執行緒卡頓錯誤。這種錯誤的嚴重程度不同,可能會對程式的穩定性和效能產生不利的影響。為了確保程式的正常運行,我們需要了解JavaFX執行緒卡頓錯誤的原因和解決方法,以及如何預防這種錯誤的發生。一、JavaFX線程卡頓錯誤的原因JavaFX是一個多線程的UI應用程式框架,它允許程式在後台執行緒執行長時

Microsoft計畫在Windows上的Outlook經典應用程式中引入AI驅動的Copilot Microsoft計畫在Windows上的Outlook經典應用程式中引入AI驅動的Copilot Oct 19, 2023 pm 11:13 PM

Microsoft顯然不會將其強大的人工智慧支援的Copilot工具保留為新應用程式的獨家功能。現在,該公司剛剛宣布計劃在Windows上的Outlook經典應用程式中引入Copilot。正如其365路線圖網站上發布的那樣,預覽將於明年<>月開始,直到<>月在當前頻道的桌面上在全球範圍內推出。 Copilot是一種生產力工具,它使用大型語言模型(LLM)來幫助使用者完成編寫電子郵件、匯總文件和翻譯語言等任務。它的主要功能之一是它能夠總結電子郵件