C++ WaitForSingleObject-每个线程一次

C++ WaitForSingleObject-每个线程一次,c++,multithreading,C++,Multithreading,我有一个程序用这个代码发送信号: hEvent = CreateEvent(NULL, FALSE, FALSE, szEventName); ... SetEvent(hEvent); 我有4个程序等待这个信号并调用一个函数: while(true) { switch (WaitForSingleObject(hEvent, 1000)) { case WAIT_OBJECT_0: doStuff(); break;

我有一个程序用这个代码发送信号:

hEvent = CreateEvent(NULL, FALSE, FALSE, szEventName);
...
SetEvent(hEvent);
我有4个程序等待这个信号并调用一个函数:

while(true) {
    switch (WaitForSingleObject(hEvent, 1000)) {
        case WAIT_OBJECT_0:
               doStuff();
        break;
    }
}
问题是,当其中一个程序使用WaitForSingleObject捕捉到信号时,其他客户端无法获得它!(只有一个程序随机获得信号)

是否有办法确保我的所有4个程序都接收到信号?

第二个参数“FALSE”生成自动重置事件。您需要通过在参数2中指定TRUE来手动重置事件:

hEvent = CreateEvent(NULL, TRUE, FALSE, szEventName);
请注意CreateEvent的第二个参数:

HANDLE WINAPI CreateEvent(
  _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
  _In_     BOOL                  bManualReset,
  _In_     BOOL                  bInitialState,
  _In_opt_ LPCTSTR               lpName
);
如果你只需要启动一次,那么这很容易,但是如果你需要启动多次,你需要通过让依赖的应用程序向源程序发送通知,让源程序知道所有4个应用程序都已收到,从而确定如何重置它

API文档中的更多信息:

当手动重置事件对象的状态发出信号时,它将一直保持信号状态,直到ResetEvent函数将其显式重置为nonsignaled。当对象的状态发出信号时,可以释放任意数量的等待线程,或随后开始对指定事件对象执行等待操作的线程

当自动重置事件对象的状态发出信号时,它将保持信号状态,直到释放单个等待线程;然后系统将自动将状态重置为非信号状态。如果没有线程等待,则事件对象的状态将保持信号状态。”