【发布时间】:2012-03-19 19:00:10
【问题描述】:
我有一个正在等待几个自动重置事件的事件循环。
事件全部初始化为数组eventHandles_ 和CreateEvent(NULL, false, false, NULL)。
while (true)
{
DWORD waitResult = WaitForMultipleObjects(3, eventHandles_, false, INFINITE);
switch (waitResult)
{
case WAIT_OBJECT_0 + 0:
//handle event...
case WAIT_OBJECT_0 + 1:
//handle event...
case WAIT_OBJECT_0 + 2:
//handle event...
}
}
我的问题:如果事件 1 和 2 同时发生,循环将处理 WAIT_OBJECT_0 + 1,因为它是第一个。但是当循环再次出现时,事件 2 是否会保持信号状态?还是会自动重置?
【问题讨论】:
-
一般来说,最好尽量避免这样的结构。我会让每个信号线程将一个合适的索引、委托或其他任何东西推送到一个线程安全的队列中并发出一个信号量。这种设计围绕着这个问题 - 行为是完全已知和可预测的,即使一个线程多次发出信号,也不会丢失任何事件,没有 64 个句柄限制,并且信号头的数量在编译时不固定。
标签: windows multithreading winapi events asynchronous