




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、windows核心編程-線程同步機(jī)制線程同步機(jī)制常用的線程同步機(jī)制有很多種,主要分為用戶模式和內(nèi)核對(duì)象兩類(lèi);其中用戶模式包括:原子操作、關(guān)鍵代碼段內(nèi)核對(duì)象包括:時(shí)間內(nèi)核對(duì)象()n、等待定時(shí)器內(nèi)核對(duì)象(i)、i信標(biāo)內(nèi)核對(duì)象()o互斥內(nèi)核對(duì)象(Mute、x、用戶模式:、1原子操作原子操作,就是該操作絕不會(huì)在執(zhí)行完畢前被任何其他任務(wù)或事件打斷,也就說(shuō),它是最小的執(zhí)行單位,不可能有比它更小的執(zhí)行單位,因此這里的原子實(shí)際是使用了物理學(xué)里的物質(zhì)微粒的概念。原子操作需要硬件的支持,因此是架構(gòu)相關(guān)的,其和原子類(lèi)型的定義都定義在內(nèi)核源碼中,因?yàn)檎Z(yǔ)言并不能實(shí)現(xiàn)這樣的操作。這個(gè)技術(shù)主要用于實(shí)現(xiàn)資源計(jì)數(shù)。原子類(lèi)型定義
2、類(lèi)似下面結(jié)構(gòu):sdoOnoionoi核心就是通過(guò)o修飾變量,告訴編譯器不要隨該變量數(shù)據(jù)做優(yōu)化處理,對(duì)它的訪問(wèn)每次都是對(duì)內(nèi)存的訪問(wèn),而不是對(duì)寄存器的訪問(wèn)。自減的原子操作運(yùn)算后的結(jié)果參數(shù)必須是位對(duì)齊的變量(即讀、寫(xiě)、加法、減法、自增、自減、比較等,常用封裝如下:/M)thod:atomicR)ad/Acss/R)turns:ii11oi以原子的左式讀取變量no修飾符確保讀取的是當(dāng)前的值,而不是緩存在寄存器的舊值sioiodinodoinss運(yùn)算后的結(jié)果參數(shù)必須是位對(duì)齊的變量(即oi類(lèi)型的),否則可能會(huì)有意想不到的問(wèn)題參數(shù)所指變量將自增o自增的原子操作ionsioiIncv(odr)tuIrnnt)
3、rlock)dIncr)m)nt(valuls)modnm)nt64(vandifoidssioi類(lèi)型的),否則可能會(huì)有意想不到的問(wèn)題參數(shù)所指變量將自減istatic_CUR_VALUE_MYWORDatomicDec(_INOUT_MYWORDvolatile*value)#ifdef_X86_returnInterlockedDecrement(value);#elsereturnInterlockedDecrement64(value);#endif/*/Method:atomicSet/Access:public/Returns:void/Qualifier:參數(shù)必須是32位對(duì)齊的變量
4、(即long類(lèi)型的),否則可能會(huì)有意想不到的問(wèn)題/Parameter:_INOUT_LONGvolatile*target/參數(shù)所指變量將與第二參數(shù)相同/Parameter:_IN_LONGvalue/Description:long類(lèi)型數(shù)值賦值以value值取代targe値/*staticvoidatomicSet(_INOUT_MYWORDvolatile*target,_IN_MYWORDvalue)#ifdef_X86_InterlockedExchange(target,value);#elseInterlockedExchange64(target,value);#endif/*/
5、Method:atomicAdd/Access:public/Returns:void/Qualifier:參數(shù)必須是32位對(duì)齊的變量(即long類(lèi)型的),否則可能會(huì)有意想不到的問(wèn)題/Parameter:_INOUT_LONGvolatile*target/參數(shù)所指變量將與第二參數(shù)相同/Parameter:_IN_LONGvalue/Description:long類(lèi)型數(shù)值賦值/*staticvoidatomicAdd(_INOUT_MYWORDvolatile*target,_IN_MYWORDvalue)#ifdef_X86_InterlockedExchangeAdd(target,va
6、lue);#elseInterlockedExchangeAdd64(target,value);#endif原子操作的缺陷在于,只能對(duì)onglong數(shù)據(jù)進(jìn)行,其他的復(fù)雜數(shù)據(jù)結(jié)構(gòu)就無(wú)能為力。1.2、臨界區(qū)(關(guān)鍵代碼段)1.2.1關(guān)鍵代碼段關(guān)鍵代碼段CRITICAL_SECTION的結(jié)構(gòu)具體定義在WinBase.h文件中,其結(jié)構(gòu)重命名為RTL_CRITICAL_SECTION;使用它有兩個(gè)要求:需要該資源的所有線程都必須知道負(fù)責(zé)保護(hù)資源的CRITICAL_SECTION結(jié)構(gòu)的地址CRITICAL_SECTION結(jié)構(gòu)必須在任何線程試圖訪問(wèn)被保護(hù)資源之前初始化初始化函數(shù)InitializeCriti
7、calSection:WINBASEAPIVOIDWINAPIInitializeCriticalSection(_Out_LPCRITICAL_SECTIONlpCriticalSection);銷(xiāo)毀函數(shù)DeleteCriticalSectionWINBASEAPIVOIDWINAPIDeleteCriticalSection(_Inout_LPCRITICAL_SECTIONlpCriticalSection);在所有共享資源之前調(diào)用EnterCriticalSection函數(shù)WINBASEAPIVOIDWINAPIEnterCriticalSection(_Inout_LPCRITICA
8、L_SECTIONlpCriticalSection);其功能如下:如果當(dāng)前沒(méi)有線程訪問(wèn)該資源,EnterCriticalSection函數(shù)便更新CRITICAL_SECTION中的相關(guān)變量,標(biāo)識(shí)調(diào)用線程已取得共享資源訪問(wèn)權(quán)限,立即返回使調(diào)用線程繼續(xù)執(zhí)行如果CRITICAL_SECTION成員變量指明調(diào)用線程已經(jīng)被賦予訪問(wèn)權(quán)限,那么EnterCriticalSection函數(shù)便更新賦予權(quán)限計(jì)數(shù)并返回-如果CRITICAL_SECTION成員變量指明共享資源已經(jīng)被其他線程占用,那么EnterCriticalSection函數(shù)便使調(diào)用線程設(shè)置為等待狀態(tài)EnterCriticalSection函數(shù)實(shí)
9、際上只做了一些測(cè)試,但是這些測(cè)試工作都是原子的。嘗試獲取權(quán)限函數(shù)TryEnterCriticalSection:WINBASEAPIBOOLWINAPITryEnterCriticalSection(_Inout_LPCRITICAL_SECTIONlpCriticalSection);TryEnterCriticalSection區(qū)別于EnterCriticalSection函數(shù)的地方在于,它會(huì)立即返回共享資源當(dāng)前是否被占用,根據(jù)返回值來(lái)決定調(diào)用線程是繼續(xù)等待嘗試還是做其他事務(wù)。訪問(wèn)共享資源結(jié)束后必須調(diào)用LeaveCriticalSection:WINBASEAPIVOIDWINAPILea
10、veCriticalSection(_Inout_LPCRITICAL_SECTIONlpCriticalSection);1.2.2自旋鎖相關(guān)的代碼段BOOLWINAPIInitializeCriticalSectionAndSpinCount(_Out_LPCRITICAL_SECTIONlpCriticalSection,_In_DWORDdwSpinCount);該函數(shù)作用是初始化階段為一個(gè)關(guān)鍵段設(shè)置一個(gè)自旋鎖,期以提高關(guān)鍵段的性能。這樣的關(guān)鍵段在后續(xù)嘗試進(jìn)/EnterCriticalSection的時(shí)候會(huì)用一個(gè)自旋鎖循環(huán)嘗試獲取權(quán)限。函數(shù)中參數(shù)dwSpinCount為自旋次數(shù)。目前路
11、人說(shuō)法是進(jìn)程關(guān)鍵段性能最佳自旋次數(shù)為4000(該數(shù)值引用自windows核心編程8.4.2關(guān)鍵代碼段與循環(huán)鎖)。dwSpinCount的高信息位有數(shù)據(jù)時(shí),它會(huì)創(chuàng)建對(duì)應(yīng)的事件內(nèi)核對(duì)象,初始化時(shí)與該代碼段關(guān)聯(lián)起來(lái)。這樣可以避免InitializeCriticalSection在內(nèi)存不足的情況可能初始化失敗的問(wèn)題,如果確認(rèn)程序后續(xù)會(huì)爭(zhēng)用關(guān)鍵代碼段或進(jìn)程在內(nèi)存短缺的環(huán)境中運(yùn)行的話。DWORDWINAPISetCriticalSectionSpinCount(_Inout_LPCRITICAL_SECTIONlpCriticalSection,_In_DWORDdwSpinCount);這個(gè)函數(shù)是對(duì)上一
12、個(gè)的補(bǔ)充,設(shè)置自旋次數(shù)。二、內(nèi)核模式線程同步機(jī)制在內(nèi)核模式下,等待函數(shù)是非常常用的一類(lèi),用于使調(diào)用線程主動(dòng)進(jìn)入等待狀態(tài)。WINBASEAPIDWORDWINAPIWaitForSingleObject(_In_HANDLEhHandle,_In_DWORDdwMilliseconds);WaitForSingleObject函數(shù)相對(duì)使用頻率比較高,針對(duì)單一內(nèi)核對(duì)象的進(jìn)入等待函數(shù),參數(shù)分別為內(nèi)核對(duì)象句柄及等待時(shí)長(zhǎng)ms)。相應(yīng)的有等待多個(gè)內(nèi)核對(duì)象信號(hào)的等待函數(shù):WINBASEAPIDWORDWINAPIWaitForMultipleObjects(_In_DWORDnCount,_In_reads
13、_(nCount)CONSTHANDLE*lpHandles,_In_BOOLbWaitAll,_In_DWORDdwMilliseconds);參數(shù)說(shuō)明:nCount,等待內(nèi)核對(duì)象句柄數(shù)量,windows定義不超過(guò)MAXIMUM_WAIT_OBJECTS,即64個(gè)IpHandles,句柄數(shù)組首地址bWaitAll,TRUE需要所有對(duì)象有信號(hào)后返回,F(xiàn)ALSE任何一個(gè)對(duì)象有信號(hào)即可返回dwMilliseconds,等待時(shí)長(zhǎng)(ms)通常用法是在等待時(shí)長(zhǎng)處傳入INFINITE,該宏定義為永遠(yuǎn)等待,WaitForSingleObject函數(shù)返回值只有3種可能:WAIT_OBJECT_0句柄對(duì)象WAI
14、T_TIMEOUTWAIT_FAILED等待到了對(duì)應(yīng)信號(hào),在WaitForMultipleObjects情況下,WAIT_OBJECT_0為數(shù)組首元素下標(biāo),以此+1取后續(xù)等待超時(shí),通常只有設(shè)置一個(gè)具體等待時(shí)長(zhǎng)才會(huì)觸發(fā)該返回值調(diào)用失敗,通常為句柄無(wú)效2.1、事件內(nèi)核對(duì)象(Event)事件內(nèi)核對(duì)象是最基本的對(duì)象。它包含一個(gè)使用計(jì)數(shù),一個(gè)用于指明該事件是個(gè)自動(dòng)重置的事件還是一個(gè)手動(dòng)重置的事件的布爾值,一個(gè)用于指明該事件處于已通知狀態(tài)還是未通知狀態(tài)的布爾值。WINBASEAPI_Ret_maybenull_HANDLEWINAPICreateEvent(_In_opt_LPSECURITY_ATTRI
15、BUTESlpEventAttributes,_In_BOOLbManualReset,_In_BOOLbInitialState,_In_opt_LPCSTRlpName);lpEventAttributes,內(nèi)核對(duì)象安全性描述結(jié)構(gòu),同其他所有內(nèi)核對(duì)象函數(shù)參數(shù)bManualReset,TRUE-手動(dòng)重置;FALSE-自動(dòng)重置-bInitialState,初始化狀態(tài):TRUE-已通知狀態(tài);FALSE-未通知狀態(tài)lpName,內(nèi)核對(duì)象在操作系統(tǒng)同一名字空間中的唯一名稱(chēng)通過(guò)CreateEvent函數(shù)創(chuàng)建事件內(nèi)核對(duì)象,調(diào)用成功返回與進(jìn)程相關(guān)的對(duì)象句柄,該進(jìn)程中的其他線程可以取得對(duì)該對(duì)象的訪問(wèn)權(quán),可以
16、使用繼承性,由DuplicateHandle函數(shù)等來(lái)調(diào)用CreateEvent,或者調(diào)用OpenEvent,在lpName參數(shù)中設(shè)定一個(gè)與調(diào)用CreateEvent時(shí)設(shè)定的匹配名字:WINBASEAPI_Ret_maybenull_HANDLEWINAPIOpenEvent(_In_DWORDdwDesiredAccess,_In_BOOLbInheritHandle,_In_LPCSTRlpName);dwDesiredAccess,需要請(qǐng)求的事件對(duì)象的訪問(wèn)權(quán)限,DELETE|READ_CONTROL|SYNCHRONIZE|WRITE_DAC|WRITE_OWNER-blnheritHan
17、dle,TRUE被此進(jìn)程創(chuàng)建的進(jìn)程繼承該對(duì)象的訪問(wèn)權(quán)限,否則不繼承l(wèi)pName,內(nèi)核對(duì)象在操作系統(tǒng)同一名字空間中的唯一名稱(chēng)OpenEvent函數(shù)可以在全局范圍內(nèi)調(diào)用,其他進(jìn)程只要知道pName樣可以獲取該對(duì)象句柄。其他關(guān)于事件對(duì)象使用基本上就只有置狀態(tài)的兩個(gè)函數(shù)SetEvent和ResetEvent,功能分別將事件置為已通知和未通知狀態(tài)。可以重復(fù)置位。WINBASEAPIBOOLWINAPISetEvent(_In_HANDLEhEvent);WINBASEAPIBOOLWINAPIResetEvent(_In_HANDLEhEvent)2.2、等待定時(shí)器內(nèi)核對(duì)象(WaitableTimer)
18、等待定時(shí)器是在某個(gè)時(shí)刻或按規(guī)定的時(shí)間間隔發(fā)出自己的信號(hào)通知的內(nèi)核對(duì)象,通常用于在某個(gè)時(shí)刻執(zhí)行某個(gè)操作。WINBASEAPI_Ret_maybenull_HANDLEWINAPICreateWaitableTimer(_In_opt_LPSECURITY_ATTRIBUTESlpTimerAttributes,_In_BOOLbManualReset,_In_opt_LPCSTRlpTimerName);IpTimerAttributes,同其他內(nèi)核對(duì)象一致的安全性描述符,通常無(wú)特殊設(shè)定傳NULLbManualReset,同事件內(nèi)核對(duì)象,說(shuō)明其是自動(dòng)置位還是手動(dòng)置位;TRUE-手動(dòng)重置;FALS
19、E-自動(dòng)重置IpTimerNam,內(nèi)核對(duì)象在操作系統(tǒng)同一名字空間中的唯一名稱(chēng)通過(guò)CreateWaitableTimer函數(shù)來(lái)創(chuàng)建一個(gè)等待定時(shí)器,類(lèi)似可以使用OpenWaitableTimer函數(shù)來(lái)取得一個(gè)已創(chuàng)建的等待定時(shí)器句柄。等待定時(shí)器對(duì)象總是在未通知狀態(tài)中創(chuàng)建,創(chuàng)建完成后必須使用SetWaitableTimer函數(shù)來(lái)告訴定時(shí)器何時(shí)稱(chēng)為已通知狀態(tài)。WINBASEAPIBOOLWINAPISetWaitableTimer(_In_HANDLEhTimer,_In_constLARGE_INTEGER*lpDueTime,_In_LONGlPeriod,_In_opt_PTIMERAPCROUT
20、INEpfnCompletionRoutine,_In_opt_LPVOIDlpArgToCompletionRoutine,_In_BOOLfResume);hTimer,等待定時(shí)器句柄lpDueTime,指明定時(shí)器何時(shí)開(kāi)始第一次報(bào)時(shí)時(shí)刻。lPeriod,指明定時(shí)器第一次報(bào)時(shí)后應(yīng)多長(zhǎng)時(shí)間間隔報(bào)時(shí),單位為mspfnCompletionRoutine,lpArgToCompletionRoutine,-fResume,TRUE-觸發(fā)時(shí)若操作系統(tǒng)處于休眠狀態(tài)會(huì)被喚醒;FALSE觸發(fā)時(shí)若操作系統(tǒng)處于休眠狀態(tài)則不會(huì)喚醒lpDueTime參數(shù)的些轉(zhuǎn)換方式:SystemTimetoFileTime將SYS
21、TIME結(jié)構(gòu)轉(zhuǎn)換為FILETIME格式,LocalFileTimeToFileTime將FILETIME結(jié)構(gòu)轉(zhuǎn)換為UTC時(shí)間后,再賦值給LARGE_INTEGER結(jié)構(gòu)傳入。常見(jiàn)用法:1給定初始時(shí)刻,后續(xù)按周期報(bào)時(shí)。不給定初始時(shí)刻,讓定時(shí)器以SetWaitableTimer時(shí)刻作為初始時(shí)刻,后續(xù)按周期報(bào)時(shí)。此時(shí)初始時(shí)刻需要傳入一個(gè)負(fù)值,且以100ns為時(shí)間間隔。僅一次報(bào)時(shí)。lPeriod傳0即可。同一個(gè)等待定時(shí)器可以重復(fù)調(diào)用SetWaitableTimer來(lái)改變其報(bào)時(shí)時(shí)間及間隔。最后,線程不應(yīng)該等待定時(shí)器的句柄,也不應(yīng)該以待命的方式等待定時(shí)器2.3、信標(biāo)內(nèi)核對(duì)象(Semaphore)信標(biāo)內(nèi)核對(duì)象
22、用于對(duì)資源進(jìn)行計(jì)數(shù)。與其他內(nèi)核對(duì)象一樣,擁有一個(gè)使用計(jì)數(shù),同時(shí)它還有另外兩個(gè)有符號(hào)的B2位值,一個(gè)是最大資源數(shù)量,一個(gè)是當(dāng)前資源數(shù)量。最大資源數(shù)量標(biāo)識(shí)信標(biāo)能夠控制的資源最大數(shù)量,而當(dāng)前資源數(shù)量則用于標(biāo)識(shí)當(dāng)前可使用資源數(shù)量。WINBASEAPI_Ret_maybenull_HANDLEWINAPICreateSemaphore(_In_opt_LPSECURITY_ATTRIBUTESlpSemaphoreAttributes,_In_LONGlInitialCount,_In_LONGlMaximumCount,_In_opt_LPCSTRlpName);lpSemaphoreAttribut
23、es,同其他內(nèi)核對(duì)象一致的安全性描述符,通常無(wú)特殊設(shè)定傳NULLllnitialCount當(dāng)前可用資源數(shù)lMaximumCount,最大資源數(shù)lpName,內(nèi)核對(duì)象在操作系統(tǒng)同一名字空間中的唯一名稱(chēng)WINBASEAPI_Ret_maybenull_HANDLEWINAPIOpenSemaphore(_In_DWORDdwDesiredAccess,_In_BOOLbInheritHandle,_In_LPCSTRlpName);dwDesiredAccess,訪問(wèn)權(quán)限bInheritHandle,是否繼承IpName,內(nèi)核對(duì)象在操作系統(tǒng)同一名字空間中的唯一名稱(chēng)CreateSemaphore函數(shù)
24、用于創(chuàng)建信標(biāo)內(nèi)核對(duì)象,同樣還有對(duì)應(yīng)的OpenSemaphore函數(shù)獲取已存在的信標(biāo)句柄。線程獲取到信標(biāo)內(nèi)核對(duì)象句柄后,通過(guò)等待函數(shù)確認(rèn)信標(biāo)當(dāng)前是否可用,等待函數(shù)在這里會(huì)檢測(cè)信標(biāo)的當(dāng)前可用資源數(shù)是否大為,大于0則使可用資源數(shù)減1,調(diào)用線程保持其可調(diào)度狀態(tài)。信標(biāo)的特點(diǎn)在于它能夠以原子操作的方式來(lái)執(zhí)行測(cè)試和設(shè)置操作,這意味著當(dāng)使用等待函數(shù)申請(qǐng)一個(gè)信標(biāo)保護(hù)的資源時(shí),操作系統(tǒng)會(huì)檢測(cè)這個(gè)資源是否可用,同時(shí)負(fù)責(zé)對(duì)該資源可用計(jì)數(shù)遞減,而不讓其他線程在這個(gè)過(guò)程中產(chǎn)生干擾。當(dāng)可用資源計(jì)數(shù)遞減后,系統(tǒng)才會(huì)允許另個(gè)線程申請(qǐng)對(duì)資源的訪問(wèn)權(quán)。如果等待函數(shù)確認(rèn)信標(biāo)的可用資源數(shù)為0時(shí),那么調(diào)用線程就會(huì)進(jìn)入等待狀態(tài),當(dāng)其他某個(gè)
25、線程對(duì)信標(biāo)保護(hù)資源釋放后,信標(biāo)可用資源計(jì)數(shù)遞增了,系統(tǒng)會(huì)重新使等待線程進(jìn)入可調(diào)度狀態(tài)(相應(yīng)遞減它當(dāng)前資源數(shù)量)。WINBASEAPIBOOLWINAPIReIeaseSemaphore(_In_HANDLEhSemaphore,_In_LONGIReIeaseCount,_Out_opt_LPLONGIpPreviousCount);hSemaphore,信標(biāo)句柄IReleaseCount,可用資源計(jì)數(shù)需要增加的數(shù)量,傳入值+當(dāng)前值創(chuàng)建信標(biāo)時(shí)最大資源計(jì)數(shù)時(shí),函數(shù)返回FALSEIpPreviousCount返回當(dāng)前資源可用計(jì)數(shù)的原始值信標(biāo)保護(hù)資源使用完畢后,需要調(diào)用ReleaseSemaphor
26、e函數(shù)來(lái)遞增信標(biāo)可用資源計(jì)數(shù)以便操作系統(tǒng)調(diào)度其他可能存在的等待訪問(wèn)資源的線程。目前沒(méi)有方法可以獲取信標(biāo)當(dāng)前可用計(jì)數(shù)。必須通過(guò)等待函數(shù)獲取到信標(biāo)訪問(wèn)權(quán)限后再ReleaseSemaphore函數(shù)取得可用計(jì)數(shù)的原始值加以計(jì)算。2.4、互斥對(duì)象內(nèi)核對(duì)象(Mutex)互斥對(duì)象內(nèi)核對(duì)象能夠確保線程(可以是不同進(jìn)程的線程)擁有對(duì)單個(gè)資源的互斥訪問(wèn)權(quán)限。互斥對(duì)象包含一個(gè)使用計(jì)數(shù),一個(gè)線程ID,個(gè)遞歸計(jì)數(shù)器。ID用于標(biāo)識(shí)系統(tǒng)當(dāng)前哪個(gè)線程擁有互斥對(duì)象,遞歸計(jì)數(shù)器用于指明線程擁有互斥對(duì)象的次數(shù)?;コ鈱?duì)象的行為特性與關(guān)鍵代碼段相同,但是互斥對(duì)象屬于內(nèi)核對(duì)象,而關(guān)鍵代碼段則屬于用戶方式的對(duì)象。這意味著互斥對(duì)象在運(yùn)行速度
27、上比關(guān)鍵段要慢,同時(shí)意味著不同進(jìn)程重的多個(gè)線程能夠訪問(wèn)單個(gè)互斥對(duì)象,并且線程在等待訪問(wèn)資源時(shí)可以設(shè)定一個(gè)超時(shí)值。通常意義下,互斥對(duì)象用于保護(hù)多個(gè)線程使用的內(nèi)存塊的訪問(wèn)權(quán)限,以保證數(shù)據(jù)的完整性。其使用規(guī)則如下:如果線程ID為0,互斥對(duì)象不被任何線程擁有,并且發(fā)出該互斥對(duì)象的通知信號(hào)如果線程ID非0,那么意味著該ID的線程用有互斥對(duì)象,并且不發(fā)出該互斥對(duì)象的通知信號(hào)-與其他內(nèi)核對(duì)象不同,互斥對(duì)象在操作系統(tǒng)中擁有特殊的代碼,語(yǔ)序它們違反正常的規(guī)則WINBASEAPI_Ret_maybenull_HANDLEWINAPICreateMutex(_In_opt_LPSECURITY_ATTRIBUTES
28、lpMutexAttributes,_In_BOOLbInitialOwner,_In_opt_LPCSTRlpName);lpMutexAttributes同其他內(nèi)核對(duì)象一致的安全性描述符,通常無(wú)特殊設(shè)定傳NULL-bInitialOwner,初始化時(shí)是否被擁有。TRUE則其線程ID為調(diào)用線程ID,遞歸計(jì)數(shù)器置為1,;FALSE則其線程ID為0,遞歸計(jì)數(shù)器置為0lpName,內(nèi)核對(duì)象在操作系統(tǒng)同一名字空間中的唯一名稱(chēng)WINBASEAPI_Ret_maybenull_HANDLEWINAPIOpenMutex(_In_DWORDdwDesiredAccess,_In_BOOLbInheritH
29、andle,_In_LPCWSTRlpName);dwDesiredAccess,要請(qǐng)求的訪問(wèn)權(quán)限blnheritHandle,是否繼承IpName,內(nèi)核對(duì)象在操作系統(tǒng)同一名字空間中的唯一名稱(chēng)必須通過(guò)CreateMutex函數(shù)創(chuàng)建一個(gè)互斥對(duì)象,或者OpenMutex函數(shù)請(qǐng)求一個(gè)已創(chuàng)建的互斥對(duì)象。其線程D和遞歸計(jì)數(shù)等都是原子操作方式。異常規(guī)則:互斥對(duì)象有一個(gè)比較特殊的情況,互斥對(duì)象當(dāng)前狀態(tài)為未通知,線程D為123,而123的線程當(dāng)前執(zhí)行到了等待函數(shù)等待獲取互斥對(duì)象的訪問(wèn)權(quán)限時(shí),操作系統(tǒng)會(huì)允許該線程進(jìn)入可調(diào)度狀態(tài)且互斥對(duì)象進(jìn)入到正常流程,狀態(tài)為已通知,遞歸計(jì)數(shù)1。若要使遞歸計(jì)數(shù)大于1,唯一的方法是讓線程多次等待相同的互斥對(duì)象,以便利用這個(gè)異常規(guī)則。旦線程使用完互斥資源時(shí),必須調(diào)用函數(shù)ReleaseMutex釋放該互斥對(duì)象以便操作系統(tǒng)調(diào)度其他等待訪問(wèn)互斥資源的線程。WlNBASEAPlBOOLWlNAPlReleaseMutex(_ln_HANDLEhMutex);該函數(shù)將互斥對(duì)象遞歸計(jì)數(shù)器減1,如果線程多次成功等待一個(gè)互斥對(duì)象,在互斥對(duì)象的遞歸計(jì)數(shù)器變成)之前,該線程必須調(diào)用同樣次數(shù)的ReleaseMutex函數(shù)直到遞歸計(jì)數(shù)為0此時(shí)該線程ID被置為0且互斥對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)。異常規(guī)則也適用于釋放互斥對(duì)象的線程,當(dāng)調(diào)用ReleaseMutex函數(shù)的線程ID與互斥對(duì)象的線
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 別墅花園裝修合同范本
- 《錦瑟》教學(xué)設(shè)計(jì) 2024-2025學(xué)年統(tǒng)編版高中語(yǔ)文選擇性必修中冊(cè)
- 借貸合同范本u
- 勞動(dòng)合同范本陜西
- 傳銷(xiāo)性質(zhì)合同范本
- 產(chǎn)品銷(xiāo)售協(xié)議合同范本
- 企業(yè)授權(quán)合同范本
- 2024年重慶大學(xué)機(jī)器人研究所招聘筆試真題
- 上海貨物短途運(yùn)輸合同范本
- 2024年溫州蒼南農(nóng)商銀行招聘筆試真題
- 領(lǐng)導(dǎo)安全生產(chǎn)事故檢討書(shū)【8篇】
- 汽車(chē)發(fā)動(dòng)機(jī)構(gòu)造與維修PPT(中職)全套完整教學(xué)課件
- 歷屆 最近十年 (新知杯)上海市初中數(shù)學(xué)競(jìng)賽試卷及答案(含模擬試題及解答)
- 艙門(mén)操作(空客系列飛機(jī))
- 臺(tái)灣長(zhǎng)庚文化村
- 藥理學(xué)免疫器官和組織
- 禮儀與溝通完整版
- 2023年超齡員工承諾書(shū) 60歲以上員工承諾書(shū)(八篇)
- 001 比較思想政治教育(第二版) 第一章
- 股骨粗隆間骨折PPT
- 供應(yīng)商年度評(píng)審記錄表
評(píng)論
0/150
提交評(píng)論