日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用内核对象进行线程同步

發(fā)布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用内核对象进行线程同步 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本章討論的是如何使用內(nèi)核對象來對線程進(jìn)行同步,與用戶模式下的同步機制相比,內(nèi)核對象的用途要廣泛的多。實際上,內(nèi)核對象唯一的缺點就是他們的性能。當(dāng)我們調(diào)用本章任何一個新函數(shù)時,調(diào)用線程必須從用戶模式切換到內(nèi)核模式,這種切換是比較耗時的。對于線程同步來說,這些內(nèi)核對象中的每一種要么處于觸發(fā)狀態(tài),要么處于未觸發(fā)狀態(tài)。微軟為每種對象創(chuàng)建了一些規(guī)則,規(guī)定如何在這兩種狀態(tài)之間進(jìn)行轉(zhuǎn)換。例如:進(jìn)程內(nèi)核對象在創(chuàng)建的時候總是未觸發(fā)狀態(tài)的。當(dāng)進(jìn)程終止的情況,操作系統(tǒng)會自動使進(jìn)程內(nèi)核對象變?yōu)橛|發(fā)狀態(tài)。當(dāng)進(jìn)程內(nèi)核對象被觸發(fā)后,它將永遠(yuǎn)保持這種狀態(tài),再也不會變回到未觸發(fā)狀態(tài)。

下面的內(nèi)核對象既可以出發(fā)觸發(fā)狀態(tài),也可以未觸發(fā)狀態(tài):

進(jìn)程 線程 作業(yè) 文件以及控制臺的標(biāo)準(zhǔn)輸入/輸出/錯誤流 事件 可等待的計時器 信號量 互斥量

線程可以自己切換到等待狀態(tài),直到另一個對象被觸發(fā)為止。windows提供了專門用來幫助我們進(jìn)行線程同步的內(nèi)核對象,事件 可等待計時器 信號量以及互斥量。

等待函數(shù)使一個線程資源進(jìn)入等待狀態(tài),直到制定的內(nèi)核對象被觸發(fā)為止。注意,如果線程在調(diào)用一個等待函數(shù)的時候,相應(yīng)的內(nèi)核對象已經(jīng)出發(fā)觸發(fā)狀態(tài),那么線程是不會進(jìn)入等待狀態(tài)的。

最常用的是WaitForSingleObject:

DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);當(dāng)線程調(diào)用這函數(shù)的時候,第一個參數(shù)hObject用來標(biāo)識要等待的內(nèi)核對象,這內(nèi)核對象可以處于觸發(fā)狀態(tài)或未觸發(fā)狀態(tài)。第二個參數(shù)用來指定線程最多愿意花多長的時間來等待對象被觸發(fā)。當(dāng)?shù)诙€參數(shù)設(shè)置為INFINITE,表示線程愿意永遠(yuǎn)等待。如果內(nèi)核對象永遠(yuǎn)不被觸發(fā),那么調(diào)用線程永遠(yuǎn)不會被喚醒。

DWORD?dw=WaitForSingleObject(hProcess,5000);?? switch(dw)?? {??cse?WAIT_OBJECT_0://規(guī)定的時間內(nèi)等待成功。??break;??case?WAIT_TIMEOUT://超時。??break;??case?WAIT_FAILED://指定的句柄無效。??break;??Default:??break;?? }

WaitForSingleObject的返回值表示為什么調(diào)用線程又能夠繼續(xù)執(zhí)行了。如果線程等待的對象被觸發(fā),那么返回值是WAIT_OBJECT_0,如果是因為等待超時,那么返回值是WAIT_TIMEOUT,如果傳入了一個無效參數(shù),那么返回值是WAIT_FAILED。(這時候可以用GetLastError得到更多的信息)

WaitForMultipleObjects()允許你在同一時間等待一個以上的對象。

DWORD WaitForMultipleObject(DWORD? nCount,?? //表示lphandles數(shù)組的元素個數(shù)CONST HANDLE? *lphandles,? //指向一個有對象handles組成的數(shù)組。BOOL? bWaitAll,??????????? //如果為true,則表示所有的handles都必須激發(fā),此函數(shù)才得以返回,否則,此函數(shù)將在任何一個handle激發(fā)時就返回。DWORD dwMilliseconds??? //超時也返回,可為0,立即返回,INFINITE表示無窮等待。 );

有兩種不同的方式來使用,一種是讓線程進(jìn)入等待狀態(tài)直到指定內(nèi)核對象的一個被觸發(fā)為止,另一種是讓線程進(jìn)入等待狀態(tài)直到制定內(nèi)核對象中的全部被觸發(fā)為止。參數(shù)bWaitAll用來告訴我們希望使用哪種方式,如果給這參數(shù)傳TRUE,那么在所有內(nèi)核對象被觸發(fā)之前,函數(shù)將不會允許調(diào)用線程繼續(xù)執(zhí)行。

下面有使用的偽代碼

HANDLE?h[3];?? H[0]=hProcess1;?? H[1=hProcess2;?? H[2]=hProcess3;?? DWORD?dw=WaitForMultipleOBjecs(3,H,false,5000);?? switch(dw)?? {??case?WAIT_OBJEC_0://第一個對象被觸發(fā)。??break;??case?WAIT_OBJEC_0+1://第二個對象被觸發(fā)。??break;??case?WAIT_OBJEC_0+2://第三個對象被觸發(fā)。??break;??case?WAIT_TIMEOUT://超時??break;??case?WAIT_FAILED://句柄無效。??break;?? }

事件內(nèi)核對象:包含一個使用技術(shù),一個用來表示事件是自動重置事件還是自動重置時間的布爾值,以及用來表示事件有沒有被觸發(fā)的布爾值。
事件的觸發(fā)表示一個操作已經(jīng)完成。有兩種不同類型的事件對象,手動重置對象和自動重置對象。當(dāng)一個手動重置對象被觸發(fā)的時候,正在等待該事件的所有線程都將變成可調(diào)度狀態(tài)。而當(dāng)一個自動重置事件被觸發(fā)時,只有一個正在等待該事件的縣城會變成可調(diào)度狀態(tài)。

事件最通常的用途是:讓一個線程執(zhí)行初始化工作,然后觸發(fā)另一個線程,讓他執(zhí)行剩余的工作,一開始的時候我們將時間初始化為未觸發(fā)狀態(tài),然后當(dāng)線程完成初始化工作的時候觸發(fā)事件。此時,另一個線程一直在等待該事件,它發(fā)現(xiàn)事件被觸發(fā),于是變成可調(diào)度狀態(tài),第二個線程知道第一個線程已經(jīng)完成了他的工作。

HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,// 安全屬性BOOLb ManualReset,// 復(fù)位方式BOOLb InitialState,// 初始狀態(tài)LPCTSTR lpName // 對象名稱 );

參數(shù)bManualReset是一個布爾值,用來告訴系統(tǒng)應(yīng)該創(chuàng)建一個手動重置時間(TRUE)還是一個自動重置時間(FALSE)。參數(shù)bInitialState表示應(yīng)該事件初始化為觸發(fā)狀態(tài)(TRUE)還是未觸發(fā)狀態(tài)(FALSE)。當(dāng)系統(tǒng)插件事件對象之后,返回一個事件內(nèi)核對象。還有一個是CreateEvent的增強版CreateEventEx。

其他進(jìn)程中的線程可以通過多種方式來訪問該事件對象,這包括調(diào)用CreateEvent并在pszName參數(shù)中傳入相同的值,使用繼承,使用DuplicateHandle函數(shù)或者調(diào)用OpenEvent并在pszName參數(shù)指定與CreateEvent中相同的名字:

HANDLE?OpenEvent(??DWORD?dwDesiredAccess,??BOOL?bInherit,??PCTSTR?pszName );??一旦我們不需要事件內(nèi)核對象的時候調(diào)用closehandlel來關(guān)閉。通過調(diào)用SetEvent可以直接控制它的狀態(tài),變成觸發(fā)狀態(tài),使用ResetEvent使得事件變成未觸發(fā)狀態(tài)。

BOOL?SetEvent(HANDLE?hEvent); BOOL?ResetEvent(HANDLE?hEvent);??

使用例子

HANDLE?g_hEvent;?? int?main()??{??g_hEvent=CreateEvent(NULL,true,false,NULL);??HANDLE?hThread=CreateThread??NULL,0,Thread1,NULL,0,NULL);??//打開文件并讀取內(nèi)存。??SetEvent(g_hEvent);//通知Thread1開始運行。??//其他操縱。??}??DWORD?WINAPI?Thread1(PVOID?param)??{??WatiForSingleObject(g_hEvent,INFINITE);??//訪問內(nèi)存。??ResetEvent(g_hEvent);??}??

可等待的計時器內(nèi)核對象:內(nèi)核對象,他會在某個指定的時間觸發(fā)或每隔一段時間觸發(fā)一次,他們通常用來在某個時間執(zhí)行一些操作。

要創(chuàng)建可等待的計時器,調(diào)用CreateWaitableTimer。

HANDLE?CreateWaitableTimer(??PSECURITY_ATTRIBUTES?psa,??BOOL?bManualReset,??PCTSTR?pszName);??

bManualReset表示要創(chuàng)建的是一個手動重置計時器還是自動重置計時器。當(dāng)手動重置計時器被觸發(fā),正在等待該計時器的所有線程都變成可調(diào)度狀態(tài)。當(dāng)自動重置計時器被觸發(fā)時,只有一個等待該計時器的線程變成可調(diào)度狀態(tài)。

進(jìn)程還可以通過OpenWaitableTimer函數(shù)來得到一個已經(jīng)存在的可等待計時器的句柄,該句柄和當(dāng)前進(jìn)程相關(guān)聯(lián)。

HANDLE?OPenWaitableTimer(??DWORD?dwDesiredAceess,??BOOL?bInheritHandle,??PCTSTR?pszName);??

在創(chuàng)建的時候,可等待的計時器對象總是處于未觸發(fā)狀態(tài),當(dāng)我們想要觸發(fā)計時器的時候,必須調(diào)用SetWaitableTimer.

BOOL?SetWaitableTimer(??HANDLE?hTimer,??Const?LARGE_INTEGEr*pDueTime,??LONG?lPeriod,??PTIMERRAPCROUTING?pfnCompletionRoutine,??PVOID?pvArgToCompletionRoutine,??BOOL?bResume);??hTimer表示我們要觸發(fā)的計時器。pDueTime和lPeriod要配合使用。pDueTime表示計時器第一次觸發(fā)的時間。lPeriod表示在第一次觸發(fā)之后,計時器的觸發(fā)頻度,它們都是以毫秒為單位。

取消定時器CancelWaitableTimer.

BOOL?CancelWaitableTimer(HANDLE?hTimer);??

用戶計時器
相信大家在使用VC時一定接觸過用戶計時器。它通過SetTimer來設(shè)置。但是好多人對它與可等待計時器混淆不清。其實,兩者最大區(qū)別就是用戶計時器需要在用戶程序中使用大量的用戶界面基礎(chǔ)設(shè)施,從而消耗更多的資源。而可等待計時器是內(nèi)核對象,不僅可以在多線程間共享而且具備安全性?。用戶計時器會產(chǎn)生WM_TIMER消息,這個消息被送到SetTimer設(shè)置的回調(diào)函數(shù)。此時只有一個線程得到通知。而可等待計時器對象可以被多個線程等待。
如果打算在計時器被觸發(fā)時執(zhí)行與用戶界面相關(guān)的操作。使用用戶計時器可使代碼更容易編寫。

信號量內(nèi)核對象:與其他所有內(nèi)核對象相同,它們也包含一個使用計數(shù),但是它們還包括另外兩個32bit值,一個最大資源計數(shù)和一個當(dāng)前資源計數(shù)。最大資源計數(shù)表示信號量可以控制的最大資源數(shù)量,當(dāng)前資源計數(shù)表示信號量當(dāng)前可用資源的數(shù)量。

信號量的規(guī)則如下:

1.如果當(dāng)前資源計數(shù)大于0,那么信號量處于觸發(fā)狀態(tài)

2.如果當(dāng)前資源計數(shù)等于0,那么信號量處于未觸發(fā)狀態(tài)

3.系統(tǒng)絕對不會讓當(dāng)前資源計數(shù)變?yōu)樨?fù)數(shù)

4.當(dāng)前資源計數(shù)絕對不會大于最大資源計數(shù)

下面函數(shù)用來創(chuàng)建信號量內(nèi)核對象:

HANDLE?CreateSomaphore(??PSECURITY_ATTRIBUTE?psa,??LONG?lInitialCount,??LONG?lMaximuCount,??PCTSTR?pszName);??

?lMaximumCount告訴系統(tǒng)應(yīng)用程序能夠處理的資源最大數(shù)量。
?lInitialCount表示這些資源一開始有多少可供使用。

任何進(jìn)程都可以調(diào)用OpenSemaphore來得到一個已經(jīng)存在的信號量的句柄

HANDLE?OpenSemaphore(??DWORD?dwDesiredAccess,??BOOL?hInheritHandle,??PCTSTR?pszName);??

線程通過調(diào)用ReleaseSemaphore來遞增信號量的當(dāng)前資源計數(shù)。

//?信號量對象句柄?? HANDLE?hSemaphore;?? UINT?ThreadProc15(LPVOID?pParam)?? {???//?試圖進(jìn)入信號量關(guān)口??WaitForSingleObject(hSemaphore,?INFINITE);??//?線程任務(wù)處理??AfxMessageBox("線程一正在執(zhí)行!");??//?釋放信號量計數(shù)??ReleaseSemaphore(hSemaphore,?1,?NULL);??return?0;?? }?? UINT?ThreadProc16(LPVOID?pParam)?? {???//?試圖進(jìn)入信號量關(guān)口??WaitForSingleObject(hSemaphore,?INFINITE);??//?線程任務(wù)處理??AfxMessageBox("線程二正在執(zhí)行!");??//?釋放信號量計數(shù)??ReleaseSemaphore(hSemaphore,?1,?NULL);??return?0;?? }?? UINT?ThreadProc17(LPVOID?pParam)?? {???//?試圖進(jìn)入信號量關(guān)口??WaitForSingleObject(hSemaphore,?INFINITE);??//?線程任務(wù)處理??AfxMessageBox("線程三正在執(zhí)行!");??//?釋放信號量計數(shù)??ReleaseSemaphore(hSemaphore,?1,?NULL);??return?0;?? }?? ……?? void?CSample08View::OnSemaphore()??? {??//?創(chuàng)建信號量對象??hSemaphore?=?CreateSemaphore(NULL,?2,?2,?NULL);??//?開啟線程??AfxBeginThread(ThreadProc15,?NULL);??AfxBeginThread(ThreadProc16,?NULL);??AfxBeginThread(ThreadProc17,?NULL);?? }?

互斥量內(nèi)核對象:用來確保一個線程獨占對一個資源的訪問,互斥量對象包含一個使用技術(shù),線程ID以及一個遞歸計數(shù)?;コ饬颗c關(guān)鍵段的行為完全相同。但是互斥量是內(nèi)核對象,而關(guān)鍵段是用戶模式下的同步對象(當(dāng)對資源的競爭比較激烈的時候,這個時候?qū)⒉坏貌贿M(jìn)入內(nèi)核模式)。

線程ID用來標(biāo)識當(dāng)前占用這互斥量的是系統(tǒng)中的哪個線程,遞歸計數(shù)表示這線程占用該互斥量的次數(shù),互斥量可以確保保證正在訪問內(nèi)存塊的任何線程會獨占對內(nèi)存塊的訪問權(quán)。

下面是互斥量的規(guī)則:

1.如果線程ID為0(無效線程ID),那么該互斥量不為任何線程所占用,它處于觸發(fā)狀態(tài)

2.如果線程ID為非0值,那么有一個線程已經(jīng)占用了該互斥量,它處于未觸發(fā)狀態(tài)

3.與所有其他內(nèi)核對象不同,操作系統(tǒng)對互斥量進(jìn)行特殊處理,允許他們違反一些常規(guī)的規(guī)則。

要使用互斥量,進(jìn)程必須先調(diào)用CreateMutexl來插件創(chuàng)建一個互斥量

HANDLE?CreateMutex(??PSECURITY_ATTRIBUTES?psa,??BOOL?bInitialOwner,??PCTSTR?pszName);???bInitialOwner用來控制互斥量的初始狀態(tài)。如果傳入false,那么表示互斥量不屬于任何線程。線程ID和遞歸計數(shù)都為0。此時互斥量處于觸發(fā)狀態(tài)。如果為true,互斥量的線程ID將被設(shè)為主調(diào)線程的線程ID,遞歸計數(shù)被設(shè)為1。

OpenMutex來打開一個已存在的互斥量。

HANDLE?OpenMutex(??DWORD?dwDesiredAccess,??BOOL?bInheritHandle,??PCTSTR?pszName);??

為了獲得對被保護(hù)資源的訪問權(quán),線程要調(diào)用等待函數(shù)并傳入互斥量句柄。在內(nèi)部,等待函數(shù)會檢查線程ID是否為0,如果為0,等待線程將互斥量對象線程ID設(shè)為當(dāng)前線程ID,遞歸計數(shù)為1。否則,主調(diào)線程將會被掛起。當(dāng)其他線程完成對保護(hù)資源的互斥訪問,釋放對互斥量的占有時,互斥量的線程ID被設(shè)為0,原來被掛起的線程變?yōu)榭烧{(diào)度狀態(tài),并將互斥量對象對象ID設(shè)為此線程ID,遞歸計數(shù)為1。
前面一直提到遞歸計數(shù),卻沒有解釋它的意思。當(dāng)線程試圖等待一個未觸發(fā)的互斥量對象,此時通常處于等待狀態(tài)。但是系統(tǒng)會檢查想要獲得互斥量的線程的線程ID與互斥量對象內(nèi)部記錄的線程ID是否相同。如果相同,那么系統(tǒng)會讓線程保持可調(diào)度狀態(tài),即使該互斥量尚未觸發(fā)。每次線程等待成功一個互斥量,互斥對象的遞歸計數(shù)就會被設(shè)為1。因此,使遞歸對象大于1?的唯一途徑是讓線程多次等待同一個互斥量。

當(dāng)目前占有互斥量的線程不再需要訪問互斥資源時,它必須調(diào)用ReleaseMutex來釋放互斥量。

BOOL?ReleaseMutex(HANDLE?hMutex);??

調(diào)用ReleaseMutex時該函數(shù)會檢查調(diào)用線程ID是否與互斥量內(nèi)部保存的線程ID相同。如果相同,那么遞歸計數(shù)會遞減。否則函數(shù)執(zhí)行失敗返回false。如果線程成功等待了互斥量對象不止一次,那么線程必須調(diào)用相同次數(shù)的ReleaseMutex才能使對象的遞歸計數(shù)變成0。

WaitFotInputIdle函數(shù):線程可以調(diào)用這函數(shù)來將自己掛起

DWORD WaitForInputIdle( HANDLE hProcess, DWORD dwMilliseconds );

hProcess 進(jìn)程的句柄。如果這個進(jìn)程是一個控制臺應(yīng)用程序或者沒有消息隊列,函數(shù)立刻返回。
dwMilliseconds 超時間隔,單位為毫秒。如果 dwMilliseconds 設(shè)為 INFINITE,函數(shù)會一直等到進(jìn)程空閑即初始化完成后才返回。

返回值 說明
0 線程初始化成功,等待結(jié)束。
WAIT_TIMEOUT 等待強制結(jié)束,線程初始化超出dwMilliseconds 。
WAIT_FAILED 出錯。會設(shè)置GetLastError。

該函數(shù)可以使一個線程掛起,直到規(guī)定線程初始化完成,等待用戶輸入。這對于父進(jìn)程和子進(jìn)程之間的同步是極其有用的,因為CreateProcess函數(shù)不會等待新進(jìn)程完成它的初始化工作。在試圖與子線程通訊前,父線程可以使用WaitForInputIdle來判斷子線程是否已經(jīng)初始化完成。舉例來說,在試圖與新進(jìn)程關(guān)聯(lián)的窗口之前,進(jìn)程應(yīng)該先調(diào)用WaitForInputIdle。

BOOL?StartProcess(char*?strCmdLine)?? {??BOOL?bRet?=?FALSE;??STARTUPINFO?sinfo;??PROCESS_INFORMATION?pinfo;??memset(&sinfo,?0,?sizeof(sinfo));??sinfo.cb?=?sizeof(STARTUPINFO);??char?szDir[4];??szDir[0]?=?strCmdLine[0];??szDir[1]?=?strCmdLine[1];??szDir[2]?=?0;??if?(CreateProcess(0,?strCmdLine,?0,?0,?0,?0,?0,?szDir,?&sinfo,?&pinfo))??{??PushLog("進(jìn)程已創(chuàng)建,等待初始化完成...");??if?(WaitForInputIdle(pinfo.hProcess,?30000)?==?0)??{??PushLog("進(jìn)程創(chuàng)建完成,初始化完畢");??bRet?=?TRUE;??}??else??{??PushLog("%s在30秒內(nèi)未初始化完成,或者有錯誤發(fā)生code=%d",?strCmdLine,?GetLastError());??}??CloseHandle(pinfo.hThread);??CloseHandle(pinfo.hProcess);??}??if?(bRet?==?FALSE)??{??DWORD_G?dwErr?=?GetLastError();??PushLog("%s在啟動過程中有錯誤發(fā)生,code=%d",?strCmdLine,?dwErr);??}??return?bRet;?? }??

線程也可以調(diào)用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectEx,這使得線程等待需要自己處理的消息。

DWORD MsgWaitForMultipleObjects(DWORD nCount,????????? // 表示pHandles所指的handles數(shù)組的元素個數(shù),最大容量是MAXIMUM_WAIT_OBJECTSLPHANDLE pHandles,???? // 指向一個由對象handles組成的數(shù)組,這些handles的類型不需要相同BOOL fWaitAll,???????? // 是否等待所有的handles被激發(fā)才返回DWORD dwMilliseconds,? // 超時時間DWORD dwWakeMask?????? // 欲觀察的用戶輸入消息類型 ); DWORD MsgWaitForMultipleObjectsEx(DWORD nCount, //句柄數(shù)組中句柄數(shù)目LPHANDLE pHandles, //指向句柄數(shù)組的指針DWORD dwMilliseconds, //以毫秒計的超時值DWORD dwWakeMask, //要等待的輸入事件類型DWORD dwFlags //等待標(biāo)志 );

這些函數(shù)與waitformultipleobjetcs函數(shù)類似,不同之處在于,不僅內(nèi)核對象被觸發(fā)的時候調(diào)用線程也會變成可調(diào)度狀態(tài),而且當(dāng)窗口消息需要被配送到一個由調(diào)用線程創(chuàng)建的窗口時,它們也會變成可調(diào)度狀態(tài)。創(chuàng)建出口的線程和執(zhí)行與用戶界面相關(guān)的任務(wù)的線程不應(yīng)該使用waitformutipleobjects而應(yīng)該使用MsgWaitForMultipleObjectsEx。這是因為前者會妨礙線程對用戶界面上的操作進(jìn)行響應(yīng)。

SignalObjectAndWait函數(shù)會通過一個原子操作來觸發(fā)一個內(nèi)核對象并等待另一個內(nèi)核對象:

DWORD WINAPI SignalObjectAndWait( __in HANDLE hObjectToSignal, __in HANDLE hObjectToWaitOn, __in DWORD dwMilliseconds, __in BOOL bAlertable );

hObjectToSignal 要通知的內(nèi)核對象的句柄.
hObjectToWaitOn 要等待的內(nèi)核對像的句柄.
dwMilliseconds 等待內(nèi)核對象的時間,以毫秒為單位.
bAlertable 如果這個值為TRUE,函數(shù)返回,并調(diào)用完成端口指定函數(shù). 如果這個值為FALSE函數(shù)不返回,也不調(diào)用指定函數(shù).

等你需要通知一個互斥內(nèi)核對象并等待一個事件內(nèi)核對象的時候,可以這么寫:

ReleaseMutex(hMutex); WaitForSingleObject(hEvent, INFINITE);可是,這樣的代碼不是以原子的方式來操縱這兩個內(nèi)核對象。因此,可以更改如下:
SignalObjectAndWait(hMutex, hEvent, INFINITE, FALSE);









總結(jié)

以上是生活随笔為你收集整理的用内核对象进行线程同步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。