互斥信号量和二进制信号量
互斥信號(hào)量和二進(jìn)制信號(hào)量的區(qū)別
??????
互斥型信號(hào)量必須是同一個(gè)任務(wù)申請(qǐng),同一個(gè)任務(wù)釋放,其他任務(wù)釋放無(wú)效。同一個(gè)任務(wù)可以遞歸申請(qǐng)。
?????? 二進(jìn)制信號(hào)量,一個(gè)任務(wù)申請(qǐng)成功后,可以由另一個(gè)任務(wù)釋放。
二進(jìn)制信號(hào)量實(shí)現(xiàn)任務(wù)互斥:
???? 打印機(jī)資源只有一個(gè),abc三個(gè)任務(wù)共享,當(dāng)a取得使用權(quán)后,為了防止其他任務(wù)錯(cuò)誤地釋放了信號(hào)量(),必須將打印機(jī)房的門(mén)關(guān)起來(lái)(進(jìn)入臨界段),用完后,釋放信號(hào)量,再把門(mén)打開(kāi)(出臨界段),其他任務(wù)再進(jìn)去打印。(而互斥型信號(hào)量由于必須由取得信號(hào)量的那個(gè)任務(wù)釋放,故不會(huì)出現(xiàn)其他任務(wù)錯(cuò)誤地釋放了信號(hào)量的情況出現(xiàn),故不需要有臨界段。互斥型信號(hào)量是二進(jìn)制信號(hào)量的子集。)
二進(jìn)制信號(hào)量實(shí)現(xiàn)任務(wù)同步:
???? a任務(wù)一直等待信號(hào)量,b任務(wù)定時(shí)釋放信號(hào)量,完成同步功能
理解互斥量和信號(hào)量 作者: JuKevin
互斥量(Mutex)?
?????? 互斥量表現(xiàn)互斥現(xiàn)象的數(shù)據(jù)結(jié)構(gòu),也被當(dāng)作二元信號(hào)燈。一個(gè)互斥基本上是一個(gè)多任務(wù)敏感的二元信號(hào),它能用作同步多任務(wù)的行為,它常用作保護(hù)從中斷來(lái)的臨界段代碼并且在共享同步使用的資源。
?????? Mutex本質(zhì)上說(shuō)就是一把鎖,提供對(duì)資源的獨(dú)占訪問(wèn),所以Mutex主要的作用是用于互斥。Mutex對(duì)象的值,只有0和1兩個(gè)值。這兩個(gè)值也分別代表了Mutex的兩種狀態(tài)。值為0, 表示鎖定狀態(tài),當(dāng)前對(duì)象被鎖定,用戶進(jìn)程/線程如果試圖Lock臨界資源,則進(jìn)入排隊(duì)等待;值為1,表示空閑狀態(tài),當(dāng)前對(duì)象為空閑,用戶進(jìn)程/線程可以Lock臨界資源,之后Mutex值減1變?yōu)?。Mutex可以被抽象為四個(gè)操作: - 創(chuàng)建 Create
- 加鎖 Lock
- 解鎖 Unlock
- 銷毀 Destroy
Mutex被創(chuàng)建時(shí)可以有初始值,表示Mutex被創(chuàng)建后,是鎖定狀態(tài)還是空閑狀態(tài)。在同一個(gè)線程中,為了防止死鎖,系統(tǒng)不允許連續(xù)兩次對(duì)Mutex加鎖(系統(tǒng)一般會(huì)在第二次調(diào)用立刻返回)。也就是說(shuō),加鎖和解鎖這兩個(gè)對(duì)應(yīng)的操作,需要在同一個(gè)線程中完成。
?
不同操作系統(tǒng)中提供的Mutex函數(shù): 動(dòng)作/系統(tǒng)
Win32
Linyx
Solaris
?
創(chuàng)建
CreateMutex
pthread_mutex_init
mutex_init
?
加鎖
WaitForSingleObject
pthread_mutex_lock
mutex_lock
?
解鎖
ReleaseMutex
pthread_mutex_unlock
mutex_unlock
?
銷毀
CloseHandle
pthread_mutex_destroy
mutex_destroy
?
?
信號(hào)量
信號(hào)量(Semaphore),有時(shí)被稱為信號(hào)燈,是在多線程環(huán)境下使用的一種設(shè)施, 它負(fù)責(zé)協(xié)調(diào)各個(gè)線程, 以保證它們能夠正確、合理的使用公共資源。
?
信號(hào)量可以分為幾類:
?
二進(jìn)制信號(hào)量(binary semaphore):
?????? 只允許信號(hào)量取0或1值,其同時(shí)只能被一個(gè)線程獲取。
?
整型信號(hào)量(integer semaphore)
?????? 信號(hào)量取值是整數(shù),它可以被多個(gè)線程同時(shí)獲得,直到信號(hào)量的值變?yōu)?。
?
記錄型信號(hào)量(record semaphore)
?????? 每個(gè)信號(hào)量s除一個(gè)整數(shù)值value(計(jì)數(shù))外,還有一個(gè)等待隊(duì)列List,其中是阻塞在該信號(hào)量的各個(gè)線程的標(biāo)識(shí)。當(dāng)信號(hào)量被釋放一個(gè),值被加一后,系統(tǒng)自動(dòng)從等待隊(duì)列中喚醒一個(gè)等待中的線程,讓其獲得信號(hào)量,同時(shí)信號(hào)量再減一。
?
?????? 信號(hào)量通過(guò)一個(gè)計(jì)數(shù)器控制對(duì)共享資源的訪問(wèn),信號(hào)量的值是一個(gè)非負(fù)整數(shù),所有通過(guò)它的線程都會(huì)將該整數(shù)減一。如果計(jì)數(shù)器大于0,則訪問(wèn)被允許,計(jì)數(shù)器減1;如果為0,則訪問(wèn)被禁止,所有試圖通過(guò)它的線程都將處于等待狀態(tài)。
計(jì)數(shù)器計(jì)算的結(jié)果是允許訪問(wèn)共享資源的通行證。因此,為了訪問(wèn)共享資源,線程必須從信號(hào)量得到通行證, 如果該信號(hào)量的計(jì)數(shù)大于0,則此線程獲得一個(gè)通行證,這將導(dǎo)致信號(hào)量的計(jì)數(shù)遞減,否則,此線程將阻塞直到獲得一個(gè)通行證為止。當(dāng)此線程不再需要訪問(wèn)共享資源時(shí),它釋放該通行證,這導(dǎo)致信號(hào)量的計(jì)數(shù)遞增,如果另一個(gè)線程等待通行證,則那個(gè)線程將在那時(shí)獲得通行證。
?
?
Semaphore可以被抽象為五個(gè)操作:
- 創(chuàng)建 Create
?
- 等待 Wait:
?
線程等待信號(hào)量,如果值大于0,則獲得,值減一;如果只等于0,則一直線程進(jìn)入睡眠狀態(tài),知道信號(hào)量值大于0或者超時(shí)。
?
-釋放 Post
?
執(zhí)行釋放信號(hào)量,則值加一;如果此時(shí)有正在等待的線程,則喚醒該線程。
?
-試圖等待 TryWait
?
如果調(diào)用TryWait,線程并不真正的去獲得信號(hào)量,還是檢查信號(hào)量是否能夠被獲得,如果信號(hào)量值大于0,則TryWait返回成功;否則返回失敗。
?
-銷毀 Destroy
?
信號(hào)量,是可以用來(lái)保護(hù)兩個(gè)或多個(gè)關(guān)鍵代碼段,這些關(guān)鍵代碼段不能并發(fā)調(diào)用。在進(jìn)入一個(gè)關(guān)鍵代碼段之前,線程必須獲取一個(gè)信號(hào)量。如果關(guān)鍵代碼段中沒(méi)有任何線程,那么線程會(huì)立即進(jìn)入該框圖中的那個(gè)部分。一旦該關(guān)鍵代碼段完成了,那么該線程必須釋放信號(hào)量。其它想進(jìn)入該關(guān)鍵代碼段的線程必須等待直到第一個(gè)線程釋放信號(hào)量。為了完成這個(gè)過(guò)程,需要?jiǎng)?chuàng)建一個(gè)信號(hào)量,然后將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個(gè)關(guān)鍵代碼段的首末端。確認(rèn)這些信號(hào)量VI引用的是初始創(chuàng)建的信號(hào)量。 動(dòng)作/系統(tǒng)
Win32
POSIX
?
創(chuàng)建
CreateSemaphore
sem_init
?
等待
WaitForSingleObject
sem _wait
?
釋放
ReleaseMutex
sem _post
?
試圖等待
WaitForSingleObject
sem _trywait
?
銷毀
CloseHandle
sem_destroy
?
?
?
互斥量和信號(hào)量的區(qū)別
1. 互斥量用于線程的互斥,信號(hào)量用于線程的同步。 ——
?????? 這是互斥量和信號(hào)量的根本區(qū)別,也就是互斥和同步之間的區(qū)別。
2.互斥量無(wú)法保證線程對(duì)資源的有序訪問(wèn),信號(hào)量可以。
?
互斥
?????? 是指某一資源同時(shí)只允許一個(gè)訪問(wèn)者對(duì)其進(jìn)行訪問(wèn),具有唯一性和排它性。但互斥無(wú)法限制訪問(wèn)者對(duì)資源的訪問(wèn)順序,即訪問(wèn)是無(wú)序的。(cute:好比一個(gè)別墅,同時(shí)只能賣個(gè)一個(gè)人。這個(gè)人可以在門(mén)上加上任意多的鎖(申請(qǐng)多次),但是鎖必須由這個(gè)人打開(kāi),因?yàn)橹挥兴莆罩€匙。如果別的人真的想控制這個(gè)別墅的大門(mén),則它首先應(yīng)該把這個(gè)別墅買下來(lái)(別墅的主人放棄所有權(quán)))
?
同步
?????? 是指在互斥的基礎(chǔ)上(大多數(shù)情況),通過(guò)其它機(jī)制實(shí)現(xiàn)訪問(wèn)者對(duì)資源的有序訪問(wèn)。在大多數(shù)情況下,同步已經(jīng)實(shí)現(xiàn)了互斥,特別是所有寫(xiě)入資源的情況必定是互斥的。少數(shù)情況是指可以允許多個(gè)訪問(wèn)者同時(shí)訪問(wèn)資源 (cute:相當(dāng)于圖書(shū)館閱覽室的書(shū)卡,你申請(qǐng)的時(shí)候-1,另一個(gè)人還的時(shí)候則可以+1,我們都可以修改書(shū)卡的當(dāng)前可用數(shù)目,這個(gè)權(quán)利是不獨(dú)屬于任何人的。)
?
3. 互斥量值只能為0/1,信號(hào)量值可以為非負(fù)整數(shù)。
?
?????? 也就是說(shuō),一個(gè)互斥量只能用于一個(gè)資源的互斥訪問(wèn),它不能實(shí)現(xiàn)多個(gè)資源的多線程互斥問(wèn)題。信號(hào)量可以實(shí)現(xiàn)多個(gè)同類資源的多線程互斥和同步。當(dāng)信號(hào)量為單值信號(hào)量是,也可以完成一個(gè)資源的互斥訪問(wèn)。
?
4. 互斥量的加鎖和解鎖必須由同一線程分別對(duì)應(yīng)使用,信號(hào)量可以由一個(gè)線程釋放,另一個(gè)線程得到。
總結(jié)
以上是生活随笔為你收集整理的互斥信号量和二进制信号量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 直击神舟十四号载人飞船发射:已发射升空
- 下一篇: epoll或者kqueue的原理是什么?