Windows中多线程同步之事件(Event)
可用事件來當(dāng)做同步的依據(jù),需使用以下函數(shù)
CreatEvent():創(chuàng)建一個(gè)事件對(duì)象
SetEvent():把指定事件對(duì)象的狀態(tài)設(shè)置為發(fā)信號(hào)狀態(tài)
ResetEvent():把指定事件對(duì)象的狀態(tài)設(shè)置為不發(fā)信號(hào)狀態(tài)
使用機(jī)制:
和事件有關(guān)的函數(shù)有:
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,
LPTSTR lpName);
BOOL SetEvent(HANDLE hEvent);
BOOL PulseEvent(HANDLE hEvent);
BOOL ResetEvent(HANDLE hEvent);
HANDLE OpenEvent(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName );
事件對(duì)象是最常用的內(nèi)核模式同步方法。它包含一個(gè)使用計(jì)數(shù)和兩個(gè)BOOL變量。其中一個(gè)BOOL變量指定這個(gè)事件對(duì)象是自動(dòng)重
置還是手工重置。另一個(gè)BOOL變量指定當(dāng)前事件對(duì)象處于有信號(hào)狀態(tài)還是無信號(hào)狀態(tài)。
函數(shù)CreateEvent創(chuàng)建一個(gè)事件對(duì)象,參數(shù)1必須為NULL,參數(shù)2指定是否手工重新設(shè)置事件對(duì)象的狀態(tài)。如果為FALSE,
當(dāng)?shù)却瘮?shù)接到信號(hào)并返回后此事件對(duì)象被自動(dòng)置為無信號(hào)狀態(tài)。這時(shí)等待此事件對(duì)象的其它線程就不會(huì)被喚醒,因?yàn)槭录?duì)象
已經(jīng)被置為無信號(hào)狀態(tài)。如果參數(shù)2設(shè)置為TRUE,當(dāng)?shù)却瘮?shù)接到信號(hào)并返回后事件對(duì)象不會(huì)被自動(dòng)置于無信號(hào)狀態(tài),其它等待
此事件對(duì)象的線程都能夠被喚醒。用ResetEvent函數(shù)可以手工將事件對(duì)象置為無信號(hào)狀態(tài)。相反SetEvent函數(shù)將事件對(duì)象置為
有信號(hào)狀態(tài)。PulseEvent函數(shù)將事件對(duì)象置為有信號(hào)狀態(tài),然后立即置為無信號(hào)狀態(tài),在實(shí)際開發(fā)中這個(gè)函數(shù)很少使用。
OpenEvent函數(shù)打開已經(jīng)創(chuàng)建的事件對(duì)象,一般用于不同進(jìn)程內(nèi)的線程同步。在調(diào)用CreateEvent創(chuàng)建一個(gè)事件對(duì)象時(shí),
傳遞一個(gè)名字給參數(shù)4,這樣在其它進(jìn)程中的線程就可以調(diào)用OpenEvent函數(shù)并指定事件對(duì)象的名字,來訪問這個(gè)事件對(duì)象。事件
一般都用在線程里,當(dāng)作信號(hào)燈。
?
總結(jié)
以上是生活随笔為你收集整理的Windows中多线程同步之事件(Event)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在一个配置文件中联系多个数据库
- 下一篇: 地域跨度入手的8zsb