WaitForSingleObject - 每个线程一次

WaitForSingleObject - Once per thread

本文关键字:一次 线程 WaitForSingleObject      更新时间:2023-10-16

>我有一个程序使用以下代码发送信号:

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 函数显式重置为非信号。在发出对象状态信号时,可以释放任意数量的等待线程或随后开始对指定事件对象执行等待操作的线程。

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