第九章 线程与本对象的联手(2)

 

老二、事件基本对象

事件基本对象是具有的基业对象被极度核心的靶子。包含一个用到计数(与持有内核对象同) ,一个用来指明该事件是自动重置的事件还是人造重置的风波之布尔值。一个用来指明该事件高居已经通报状态还是未通报状态的布尔值。

事件基本对象的项目:

事在人为重置的轩然大波基本对象,事件得到通知时,等待该事件之持有线程均成为可调度线程。

机动重置的事件基本对象,事件得到关照时,等待该事件之线程中只生一个线程变为可调度线程。

事件的利用(一个线程执行初始化操作,然后通知其他一个线程执行剩余操作时用得最好多)

事件初始化为不通状态,然后,当该线程完成其的初始化操作后,它就是用事件设置为就通知状态。这时,一直以等待该事件的其他一个线程发现该事件早已得到关照,因此其便成可调度线程。这第二个线程知道第一单线程已经完成了它的操作。

  1. 开创事件基本对象:

HANDLE CreateEvent(PSECURITY_ATTRIBUTES psa, BOOL fManualReset,

BOOL fInitialState,
PCTSTR pszName);

psa指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被进程继续。如果是NULL此句柄不可知吃连续。

fManualReset指定事件目标的种类,TRUE(人工重置的轩然大波)FALSE(自动重置的事件)。fInitialState指定事件初始化为已通报状态(TRUE),还是勿通知状态(FALSE)。

pszName指定事件目标的讳,如果同一个存在的命名的波目标的称呼一致,函数将请EVENT_ALL_ACCESS来访问是的靶子。这时候,由于fManualReset和fInitialState这有限个参数将被忽视。如果psa不是NULL,将确定这句柄是否好让接续,但是该安描述称成员用吃忽视。

 如果lpName为NULL,将创一个无名之事件目标。如果lpName的和一个有的信号、互斥、等待计时器、作业还是是文件映射对象名称一致,函数将见面失败,在GetLastError函数中将返回ERROR_INVALID_HANDLE。造成这种现象之因是这些目标同享同一个命名空间。

CreateEvent返回事件目标的句柄,其他进程中之线程可以看该事件目标。方法是运继承性,用DuplicateHandle函数等来调用CreateEvent,或调用OpenEvent ,在pszName参数中设定一个暨调用CreateEvent时设定的讳相匹配的名字。当不待该事件目标时调用CloseHandle函数将那个释放。

HANDLE OpenEvent(DWORD fdwAccess, BOOL fInherit, PCTSTR pszName);

  1. 设置事件基本对象

BOOL SetEvent(HANDLE
hEvent); //将事件设为已通报状态

BOOL ResetEvent(HANDLE
hEvent); //将事件使为非通状态

BOOL PulseEvent(HANDLE
hEvent); // 使得事件成为已通报状态,然后就变成不通状态

相关文章