最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

秒殺多線程-互斥量Mutex

2023-02-02 20:45 作者:ベ計(jì)院小白隆ミ  | 我要投稿

推薦閱讀:

互斥量也是一個(gè)內(nèi)核對(duì)象,它用來(lái)確保一個(gè)線程獨(dú)占一個(gè)資源的訪問(wèn)?;コ饬颗c關(guān)鍵段的行為非常相似,并且互斥量可以用于不同進(jìn)程中的線程互斥訪問(wèn)資源。使用互斥量Mutex主要將用到四個(gè)函數(shù)。


函數(shù)的原型和使用說(shuō)明

CreateMutex()

函數(shù)功能:創(chuàng)建互斥量(注意與事件Event的創(chuàng)建函數(shù)對(duì)比)

函數(shù)原型:

函數(shù)說(shuō)明:第一個(gè)參數(shù)表示安全控制,一般直接傳入NULL。

第二個(gè)參數(shù)用來(lái)確定互斥量的初始擁有者。如果傳入TRUE表示互斥量對(duì)象內(nèi)部會(huì)記錄創(chuàng)建它的線程的線程ID號(hào)并將遞歸計(jì)數(shù)設(shè)置為1,由于該線程ID非零,所以互斥量處于未觸發(fā)狀態(tài)。如果傳入FALSE,那么互斥量對(duì)象內(nèi)部的線程ID號(hào)將設(shè)置為NULL,遞歸計(jì)數(shù)設(shè)置為0,這意味互斥量不為任何線程占用,處于觸發(fā)狀態(tài)。

第三個(gè)參數(shù)用來(lái)設(shè)置互斥量的名稱,在多個(gè)進(jìn)程中的線程就是通過(guò)名稱來(lái)確保它們?cè)L問(wèn)的是同一個(gè)互斥量。如果 lpName 與現(xiàn)有命名互斥對(duì)象的名稱匹配,則此函數(shù)將請(qǐng)求MUTEX_ALL_ACCESS訪問(wèn)權(quán)限。在這種情況下,將忽略 bInitialOwner 參數(shù),因?yàn)樗延蓜?chuàng)建過(guò)程設(shè)置。如果 lpMutexAttributes 參數(shù)不是 NULL,則確定是否可以繼承句柄,但忽略其安全描述符成員。

如果 lpNameNULL,則創(chuàng)建互斥對(duì)象時(shí)沒(méi)有名稱。

如果 lpName 與現(xiàn)有事件、信號(hào)量、可等待計(jì)時(shí)器、作業(yè)或文件映射對(duì)象的名稱匹配,則該函數(shù)將失敗,并且 GetLastError 函數(shù)將返回ERROR_INVALID_HANDLE。發(fā)生這種情況是因?yàn)檫@些對(duì)象共享相同的命名空間。

返回值:成功返回一個(gè)表示互斥量的句柄,失敗返回NULL


OpenMutex()

函數(shù)功能:打開(kāi)互斥量

函數(shù)原型:

函數(shù)說(shuō)明:

第一個(gè)參數(shù)表示訪問(wèn)權(quán)限,對(duì)互斥量一般傳入MUTEX_ALL_ACCESS。

第二個(gè)參數(shù)表示互斥量句柄繼承性,一般傳入TRUE即可。

第三個(gè)參數(shù)表示名稱。某一個(gè)進(jìn)程中的線程創(chuàng)建互斥量后,其它進(jìn)程中的線程就可以通過(guò)這個(gè)函數(shù)來(lái)找到這個(gè)互斥量。

返回值:成功返回一個(gè)表示互斥量的句柄,失敗返回NULL


ReleaseMutex()

函數(shù)功能:釋放指定互斥鎖對(duì)象的所有權(quán)

函數(shù)原型:

函數(shù)說(shuō)明:

如果調(diào)用線程不擁有互斥對(duì)象,則 ReleaseMutex() 函數(shù)將失敗。訪問(wèn)互斥資源前應(yīng)該要調(diào)用等待函數(shù),結(jié)束訪問(wèn)時(shí)就要調(diào)用ReleaseMutex()來(lái)表示自己已經(jīng)結(jié)束訪問(wèn),其它線程可以開(kāi)始訪問(wèn)了。

最后一個(gè)清理互斥量

由于互斥量是內(nèi)核對(duì)象,因此使用CloseHandle()就可以(這一點(diǎn)所有內(nèi)核對(duì)象都一樣)。


仿造事件Event寫(xiě)代碼

事件Event

可以看出,與關(guān)鍵段類(lèi)似,互斥量也是不能解決線程間的同步問(wèn)題。

聯(lián)想到關(guān)鍵段會(huì)記錄線程ID即有“線程擁有權(quán)”的,而互斥量也記錄線程ID,莫非它也有“線程擁有權(quán)”這一說(shuō)法。

答案確實(shí)如此,互斥量也是有“線程擁有權(quán)”概念的?!熬€程擁有權(quán)”在關(guān)鍵段中有詳細(xì)的說(shuō)明,這里就不再贅述了。另外由于互斥量常用于多進(jìn)程之間的線程互斥,所以它比關(guān)鍵段還多一個(gè)很有用的特性——“遺棄”情況的處理。比如有一個(gè)占用互斥量的線程在調(diào)用ReleaseMutex()觸發(fā)互斥量前就意外終止了(相當(dāng)于該互斥量被“遺棄”了),那么所有等待這個(gè)互斥量的線程是否會(huì)由于該互斥量無(wú)法被觸發(fā)而陷入一個(gè)無(wú)窮的等待過(guò)程中了?這顯然不合理。因?yàn)檎加媚硞€(gè)互斥量的線程既然終止了那足以證明它不再使用被該互斥量保護(hù)的資源,所以這些資源完全并且應(yīng)當(dāng)被其它線程來(lái)使用。因此在這種“遺棄”情況下,系統(tǒng)自動(dòng)把該互斥量?jī)?nèi)部的線程ID設(shè)置為0,并將它的遞歸計(jì)數(shù)器復(fù)置為0,表示這個(gè)互斥量被觸發(fā)了。然后系統(tǒng)將“公平地”選定一個(gè)等待線程來(lái)完成調(diào)度(被選中的線程的WaitForSingleObject()會(huì)返回WAIT_ABANDONED_0)。


兩個(gè)程序驗(yàn)證

首先驗(yàn)證事件Event

啟動(dòng)兩個(gè)VS,運(yùn)行兩個(gè)程序,可以自行百度怎么運(yùn)行

第一個(gè)程序:

第二個(gè)程序:

先運(yùn)行第一個(gè)程序,再運(yùn)行第二個(gè)程序,如果先運(yùn)行第二個(gè)程序,會(huì)直接輸出打開(kāi)事件失敗


exit(0)注釋去掉

第一個(gè)程序會(huì)因?yàn)閳?zhí)行exit(0)退出,第二個(gè)程序會(huì)一直等到超時(shí)

驗(yàn)證互斥量Mutex

第一個(gè)程序:

第二個(gè)程序

正常執(zhí)行與事件結(jié)果一樣,當(dāng)程序意外退出時(shí),互斥量不會(huì)像事件一樣一直等


有這個(gè)對(duì)“遺棄”問(wèn)題的處理,在多進(jìn)程中的線程同步也可以放心的使用互斥量。

總結(jié)互斥量Mutex

1.互斥量是內(nèi)核對(duì)象,它與關(guān)鍵段都有“線程所有權(quán)”所以不能用于線程的同步。

2.互斥量能夠用于多個(gè)進(jìn)程之間線程互斥問(wèn)題,并且能完美的解決某進(jìn)程意外終止所造成的“遺棄”問(wèn)題。


下一篇將介紹信號(hào)量Semaphore


參考:https://blog.csdn.net/morewindows/article/details/7470936


秒殺多線程-互斥量Mutex的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
乳山市| 象州县| 沙坪坝区| 嵩明县| 镇宁| 屯留县| 福贡县| 筠连县| 汝城县| 邵武市| 包头市| 曲沃县| 聂拉木县| 长岭县| 收藏| 竹北市| 中江县| 石首市| 横山县| 桂东县| 富民县| 营口市| 定襄县| 长沙市| 和林格尔县| 衢州市| 九寨沟县| 马尔康县| 莫力| 洪江市| 禹城市| 铜川市| 乡宁县| 石景山区| 苍山县| 凤冈县| 阜平县| 和静县| 平顺县| 平山县| 巩义市|