日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

事件EVENT与waitforsingleobject的使用以及Mutex与Event的区别

發布時間:2025/3/17 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 事件EVENT与waitforsingleobject的使用以及Mutex与Event的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Mutex與Event控制互斥事件的使用詳解最近寫一程序,誤用了Mutex的功能,錯把Mutex當Event用了。【Mutex】使用Mutex的主要函數:CreateMutex、ReleaseMutex、OpenMutex、WaitForSingleObject、WaitForMultipleObjects。CreateMutex:其中第二個參數是表示當前線程擁有權。TRUE:創建線程獲得初始所有權的互斥對象(即信號已被當前線程獲得,沒有釋放前其它線程不能獲得。如果當前線程調用了WaitForSingleObject 函 數, 則釋放次數等于調用次數加1)。     FALSE:創建線程沒有獲得互斥對象的所有權。也就是自由爭取,看誰先Wait到。 不管怎么樣,MUtex的釋放規則是:誰擁有誰釋放,還有在線程結束時, 線程所獲得的Mutex自動釋放;當然還可以使用命名Mutex做唯一性驗證,這個在整個windows生存期下有效。【Event】與Mutex不一樣,Event是任何時候都是可以操作的,而且沒有同調用多次WaitForSingleObject和同時釋放多次一說。它的主要操作函數有: CreateEvent、SetEvent、WaitForSingleObject。CreateEvent參數說明。第二個參數表示調用WaitForSingleObject后手動(TRUE)/自動(FALSE)為無信號狀態。第三個參數表示初始狀態為有(TRUE)/無(FALSE)信號。  Event的獲得是通過一個隊列去排隊獲得的,SetEvent沒有限制使用,在任何可以調用的地方都可以調用。Mutex,的互斥是以線程為基本單位,而Event是以代碼段為基本單位。所以在兩者的使用上有著不同的功能用途。https://www.cnblogs.com/upendi/archive/2013/02/25/2932154.html

?

?

事件EVENT與waitforsingleobject的使用 事件event與waitforsingleobject的配合使用,能夠解決很多同步問題,也可以在數據達到某個狀態時啟動另一個線程的執行,如報警。event的幾個函數:1、CreateEvent和OpenEventHANDLE WINAPI CreateEvent(__in LPSECURITY_ATTRIBUTES lpEventAttributes, //表示安全控制,一般直接傳入NULL,表示不能被子進程繼承__in BOOL bManualReset, //參數確定事件是手動置位還是自動置位,傳入TRUE表示手動置位,傳入FALSE表示自動置位。__in BOOL bInitialState, //Event的初始狀態, TRUE為觸發,FALSE未觸發__in LPCTSTR lpName //Event object的名字,NULL表示沒名字(without a name));要是CreateEvent創建的事件沒名字 這個函數就沒啥用了,不多做介紹,可查看msn。 1 HANDLE WINAPI OpenEvent( //獲得已經存在的Event的事件句柄 2 __in DWORD dwDesiredAccess, 3 __in BOOL bInheritHandle, 4 __in LPCTSTR lpName //要打開的事件名字 5 );2、SetEvent,觸發事件BOOL SetEvent(HANDLE hEvent);3、ResetEvent,使事件狀態設為未觸發,如在創建事件時第二個參數為TRUE手動設置,則需要該函數去恢復事件為未觸發狀態。BOOL SetEvent(HANDLE hEvent);4、PulseEvent, 如在創建事件時第二個參數為TRUE手動設置,其功能相當于SetEvent()后立即調用ResetEvent()BOOL PulseEvent(HANDLE hEvent)也就是說在自動重置模式下PulseEvent和SetEvent的作用沒有什么區別,但在手動模式下PulseEvent就有明顯的不同, 可以比較容易的控制程序是單步走,還是連續走。如果讓循環按要求執行一次就用PulseEvent,如果想讓循環連續不停的運轉就用SetEvent ,在要求停止的地方發個ResetEvent就OK了。5、CloseHandle(),關閉該句柄。**********WaitForSingleObject函數。使線程處于等待狀態,如等待某一事件的觸發。DWORD WINAPI WaitForSingleObject(HANDLE hHandle, //等待的觸發句柄 , 如前面說的Event的句柄DWORD dwMilliseconds //等待多長時間,單位ms 如5000 則為5s 若為INFINITE表示無限等待 );

?http://www.cnblogs.com/LouMengzhao/p/6076368.html

http://blog.sina.com.cn/s/blog_6163bdeb0100qlw1.html

?

事件和其他量一樣,也是一個內核對象。使用事件可以進行同步,主要是可以規定先后順序。事件分為手動置位事件和自動置位事件,兩個的關系是什么呢?手動置位事件就是你一旦觸發之后,所有的狀態都被釋放。自動置位事件你觸發之后,只有一個狀態被釋放,這個時候就有不確定性了。如何使用事件?有這么幾個函數。第一個 CreateEvent函數功能:創建事件函數原型:HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,BOOLbManualReset,BOOLbInitialState,LPCTSTRlpName);函數說明:第一個參數表示安全控制,一般直接傳入NULL。第二個參數確定事件是手動置位還是自動置位,傳入TRUE表示手動置位,傳入FALSE表示自動置位。如果為自動置位,
則對該事件調用WaitForSingleObject()后會自動調用ResetEvent()使事件變成未觸發狀態。打個小小比方,
手動置位事件相當于教室門,教室門一旦打開(被觸發),所以有人都可以進入直到老師去關上教室門(事件變成未觸發)。
自動置位事件就相當于醫院里拍X光的房間門,門打開后只能進入一個人,這個人進去后會將門關上,其它人不能進入除非門重新被打開(事件重新被觸發)。第三個參數表示事件的初始狀態,傳入TRUR表示已觸發。第四個參數表示事件的名稱,傳入NULL表示匿名事件。第二個 OpenEvent函數功能:根據名稱獲得一個事件句柄。函數原型:HANDLEOpenEvent(DWORDdwDesiredAccess,BOOLbInheritHandle,LPCTSTRlpName //名稱);函數說明:第一個參數表示訪問權限,對事件一般傳入EVENT_ALL_ACCESS。詳細解釋可以查看MSDN文檔。第二個參數表示事件句柄繼承性,一般傳入TRUE即可。第三個參數表示名稱,不同進程中的各線程可以通過名稱來確保它們訪問同一個事件。第三個SetEvent函數功能:觸發事件函數原型:BOOLSetEvent(HANDLEhEvent);函數說明:每次觸發后,必有一個或多個處于等待狀態下的線程變成可調度狀態。第四個ResetEvent函數功能:將事件設為末觸發函數原型:BOOLResetEvent(HANDLEhEvent);最后一個事件的清理與銷毀由于事件是內核對象,因此使用CloseHandle()就可以完成清理與銷毀了。關于之前的那個問題,如何來設置同步呢?首先是初始化:? ?//事件與關鍵段 ?HANDLE g_hThreadEvent; ?CRITICAL_SECTION g_csThreadCode; ? ? //初始化事件和關鍵段 自動置位,初始無觸發的匿名事件 ? g_hThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL); ? InitializeCriticalSection(&g_csThreadCode); ? //銷毀事件和關鍵段 ? CloseHandle(g_hThreadEvent); ? DeleteCriticalSection(&g_csThreadCode); ?? ? ?關鍵代碼段修改: ?主循環當中: ? while (i < THREAD_NUM) ? { ? handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL); ? WaitForSingleObject(g_hThreadEvent, INFINITE); //等待事件被觸發i++; ? } ?線程函數當中: ?? ?int nThreadNum = *(int *)pPM; ? SetEvent(g_hThreadEvent); //觸發事件于是就可完成同步工作。匿名和有名的差別:匿名的時候具有親緣關系的才能看到,而有名管道則可以在其他進程當中看到,這個是大部分的差別。如果是有名的,那么create的時候,如果有名的已經存在,則返回之前的相應的句柄。?另外需要注意的就是注意等待的副作用,如果是自動重置,可能wait觸發之后會reset.關于函數pulseEvent函數功能:將事件觸發后立即將事件設置為未觸發,相當于觸發一個事件脈沖。函數原型:BOOLPulseEvent(HANDLEhEvent);函數說明:這是一個不常用的事件函數,此函數相當于SetEvent()后立即調用ResetEvent();此時情況可以分為兩種:1.對于手動置位事件,所有正處于等待狀態下線程都變成可調度狀態。2.對于自動置位事件,所有正處于等待狀態下線程只有一個變成可調度狀態。此后事件是末觸發的。該函數不穩定,因為無法預知在調用PulseEvent ()時哪些線程正處于等待狀態。?如何理解,可以理解為一個脈沖,只解放當時在等待的那些,而之后的就不在考慮了。一個簡答的例子解釋:觸發一個事件脈沖PulseEvent ()寫一個例子,主線程啟動7個子線程,其中有5個線程Sleep(10)后對一事件調用等待函數(稱為快線程),
另有2個線程Sleep(100)后也對該事件調用等待函數(稱為慢線程)。主線程啟動所有子線程后再Sleep(50)保證有5個快線程都正處于等待狀態中。
此時若主線程觸發一個事件脈沖,那么對于手動置位事件,這5個線程都將順利執行下去。對于自動置位事件,這5個線程中會有中一個順利執行下去。
而不論手動置位事件還是自動置位事件,那2個慢線程由于Sleep(100)所以會錯過事件脈沖,因此慢線程都會進入等待狀態而無法順利執行下去。? http://blog.sina.com.cn/s/blog_c33b15000102x3oa.html

總結

以上是生活随笔為你收集整理的事件EVENT与waitforsingleobject的使用以及Mutex与Event的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。