Win32 ::CreateEvent() 函数

微软有一个很有意思的同步对象,某种程度上和Linux的条件变量很相似。但秉承微软一贯的作风,有些地方设计的又有点怪异。Event通过函数CreateMutex创建,可以分为手动模式和自动模式两种模式,两种模式下表现迥异。和其他同步对象一样,在WaitForSingleObject或者WaitForMultipleObjects等待激发。激发(取消激发)法有3个函数SetEvent,ResetEvent,PulseEvent根据模式不同给出说明如下表


HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,// 安全属性
BOOL bManualReset,// 复位方式
BOOL bInitialState,// 初始状态
LPCTSTR lpName // 对象名称
);

// 函数介绍:创建一个事件内核对象,当该事件内核对象为受信状态时,所以所有等待该事件内核对象的线程都会被唤醒,以继续做接下来的工作。若该事件内核对象为未(非)受信状态时,所以所有等待该事件内核对象的线程都会阴塞阻塞等待(当然设置了不等待属性的除外)。

// 第一个参数(LPSECURITY_ATTRIBUTES lpEventAttributes)为事件内核对象的安全属性(指针),一般情况为NULL,我对此也不了解,所以不做评论

// 第二个参数(BOOL bManualReset) 复位方式,事件内核对象有两种状态,一个是受信状态,一个是未(非)受信状态。当事件为受信状态时所有等待该事件(一般为函数:WaitForSingleObject() )的线程都会被唤醒(从阻塞状态激活);反之,它将一般一直阻塞等到该事件为受信状态。若该参数为TRUE, 则需要使用ResetEvent() 函数来重置该事为未(非)受信状态,否则该事件将永远为受信状态;若该参数为FALSE, 则一但有一个线程被唤醒,则该事件马上会被置为未(非)受信状态。这使得其它也等待该事件的线程无法被唤醒。
BOOL ResetEvent(HANDLE hEvent);// 这个函数把指定的事件对象设置为未(非)受信状态。
BOOL SetEvent(HANDLE hEvent);// 这个函数把指定的事件对象设置为受信状态。

// 第三个参数(BOOL bInitialState)初始状态,若为TRUE, 新建出来的事件内核对象将是受信状态,否则为未(非)爱信状态。

// 第四个参数(LPCTSTR lpName)对象名称。指定事件的对象的名称,是一个以0结束的字符串。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。
如果lpName指定的名字,与一个存在的命名的事件对象的名称相同,函数将请求EVENT_ALL_ACCESS来访问存在的对象。这时候,由于bManualReset和bInitialState参数已经在创建事件的进程中设置,这两个参数将被忽略。如果lpEventAttributes是参数不是NULL,它将确定此句柄是否可以被继承,但是其安全描述符成员将被忽略。
如果lpName为NULL,将创建一个无名的事件对象。
如果lpName的和一个存在的信号、互斥、等待计时器、作业或者是文件映射对象名称相同,函数将会失败,在GetLastError函数中将返回ERROR_INVALID_HANDLE。造成这种现象的原因是这些对象共享同一个命名空间。

// 关闭事件内核对象,释放资源
BOOL CloseHandle(HANDLE hObject);

相关函数:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章