Event对象被运用在多种类型的高级 I/O 操作中
产生一个event对象
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset, // FALSE, 表示这个event将在变成激发状态(因而唤醒一个线程)之后, 自动重置(reset)为非激发状态
// TRUE, 表示不会自动重置, 必须靠程序操作(调用ResetEvent())才能将激发状态的event重置为非激发状态
BOOL bInitialState, // TRUE, event一开始处于激发状态; FALSE, event一开始处于非激发状态
LPCTSTR lpName // 对象的名称. 任何线程或进程都可以根据这个名称, 使用这 event
);
如果调用成功, 会传回一个event handle, GetLastError()会传回0. 如果lpName所指定的event对象已经存在, CreateEvent()传回的是该eventhandle, 而不会产生一个新的. 这时候GetLastError()会传回ERROR_ALREADY_EXISTS. 如果 CreateEvent()失败, 传回的是NULL, GetLastError()可以获得更进一步的失败信息
Windows操作系统会强迫让等待中的线程有轮番更替的机会. 对于所有同步机制, 这都是一个重要的行为. 如果操作系统没有强迫实现某种层次的公平性, 可能会有某个线程不断获得执行机会, 而某个线程一直未能获得 CPU 的青睐. 这种情况被称为饥饿(starvation)