WaitForSingleObject - 每个线程一次
WaitForSingleObject - Once per thread
>我有一个程序使用以下代码发送信号:
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 函数显式重置为非信号。在发出对象状态信号时,可以释放任意数量的等待线程或随后开始对指定事件对象执行等待操作的线程。
当自动重置事件对象的状态发出信号时,它将保持信号状态,直到释放单个等待线程;然后系统会自动将状态重置为无信号。如果没有线程在等待,则事件对象的状态将保持信号。
相关文章:
- 唤醒多个线程以在每个条件下工作一次
- 我需要线程函数在不停止实际程序的情况下,每2秒打印一次随机数
- E/libEGL:调用没有当前上下文的 OpenGL ES API (每个线程记录一次) - Android/SDL
- 使用互斥锁将一次运行的线程数限制为 2
- 如何在C 中等待一组线程或其他事件
- 如果我确定只有一个线程一次处理指针/对象,则C/C 仍应使用同步
- OpenMP 一次只执行一个线程
- 线程仅执行一次
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- Boost:创建一组线程并等待所有线程的正确习惯用法是什么
- 在一次调用C++11中启动多个线程
- 如何将while循环的每一次迭代都分配给线程
- Play Framework - System.loadLibrary() 每个线程只有一次
- WaitForSingleObject - 每个线程一次
- 如何一次创建多个线程
- OpenMP - 仅创建一次线程
- pthread_create()在Xeon Phi上每60个线程失败一次(参数无效)
- 为什么一个子线程的执行时间多于整个应用程序的执行时间
- 在没有默认构造函数的OpenMP中,每个线程执行一次代码
- c++在次线程中运行任务,并期望在主线程中得到响应