Windows CreateEvent函数在多线程中使用及实例

HANDLE CreateEvent(
	LPSECURITY_ATTRIBUTES lpEventAttributes,
	BOOL bManualReset, 
	BOOL bInitialState,
	LPCSTR lpName
);

lpEventAttributes:指向SECURITY_ATTRIBUTES结构体,此结构体决定函数的返回句柄是否可以让子进程继承。如果这个参数为NULL,这个句柄是不能继承的。一般情况下,这个参数设置为NULL。

bManualReset:创建一个手动重置事件(TRUE),还是创建一个自动重置事件(FALSE)。

手动置位事件相当于教室门,教室门一旦打开(被触发),所以有人都可以进入直到老师去关上教室门(事件变成未触发)。

自动置位事件就相当于医院里拍X光的房间门,门打开后只能进入一个人,这个人进去后会将门关上,其它人不能进入除非门重新被打开(事件重新被触发),即重新使用SetEvent()。

人工重置方式的时候,一旦内核对象得到通知,所有等待该内核对象的线程都变为可调度线程,等待CPU分配时间,如果程序没有主动将该内核置为未通知状态,则内核对象将一直处于通知状态,所有等待该内核对象的线程也将一直处于可调度状态。若要将该内核对象置为未通知状态,需要程序主动去做这件事,即主动将内核对象置为未通知状态。;

自动重置方式的时候,一旦内核对象变为通知状态,则所有等待该内核对象的线程只有一个线程变为可调度线程,等待CPU分配执行时间,然后该内核对象有马上自动重置成未通知状态。WaitForSingleObject()返回。

bInitialState:初始状态。如果为TRUE,初始状态为有信号;如果为FALSE,初始状态为无信号。hEvent有信号,处于触发状态,无信号则为未触发状态。
 

使用此对象实现进程间同步:

  • 在CreateEvent函数中,lpEventAttributes参数指定句柄可被继承时,通过CreateProcess函数创建的子进程继承的事件对象句柄。
  • 一个进程可以在DuplicateHandle函数中指定事件对象句柄,从而获得一个复制的句柄,此句柄可以被其它进程使用。
  • 一个进程可以在OpenEvent或CreateEvent函数中指定一个名字,从而获得一个有名的事件对象句柄。(在调用OpenEvent或CreateEvent函数时,一个进程可以指定事件对象的名字。)
  • 使用CloseHandle函数关闭句柄。当进程终止时,系统将自动关闭句柄。事件对象会被销毁,当最后一个句柄被关闭。

WaitForSingleObject

用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。

SetEvent
函数功能:触发事件
函数原型:BOOLSetEvent(HANDLEhEvent);
函数说明:每次触发后,必有一个或多个处于等待状态下的线程变成可调度状态。

ResetEvent
函数功能:将事件设为末触发
函数原型:BOOLResetEvent(HANDLEhEvent);

由于事件是内核对象,因此使用CloseHandle(Event)就可以完成清理与销毁了

 

 

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