通过CreateMutex同样也可以创建一个信号量,只不过这个信号量需要用ReleaseMutex才能释放,也就是说当一个线程通过WaitFor....返回以后,在该线程调用ReleaseMutex之前,其它线程的WaitFor...都会挂起,这就是互斥,用于互斥操作的还有很多种,一般的书上都有介绍的
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, //安全属性
BOOL bManualReset, //复位方式
BOOL bInitialState, //初始状态
LPCTSTR lpName //对象名称
);
通过CreateEvent创建出来的就是一个信号量,调用该函数时通过参数可指定该信号量的初始值,是否手工复位等属性
调用SetEvent可以使信号量处于有信号状态,如果创建时指定的是自动复位,则在WaitForSingleObject调用返回后,该信号量自动变为无信号状态,如果指定的是手工复位,则即使WaitFor...返回以后该信号量仍然处于有信号状态,必须用ResetEvent来将该信号量恢恢复到无信号状态
bManualReset:
[输入]指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。
bInitialState:
[输入]指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
WaitForSingleObject等待有信号状态
先用CreateSemaphore初始化最大数和当前数
当前数为0时,信号灯为nonsingled状态,也就是说这时用WaitForSingleObject时会等待直到当前数大于0(或超时),如果不为0时,用WaitForSingleObject就马上返回并把当前数减一;
那如何增加当前数呢? 曰: ReleaseSemaphore.