【发布时间】:2013-02-19 04:25:03
【问题描述】:
似乎有时WaitForSingleObject 会等待超时,即使事件已发出信号。
信号线程每次都从SetEvent() 接收成功。但是,发出信号的线程并不总是能听到信号。如果我在信号线程中添加一个冗余的SetEvent(),问题就会消失。
显然这里有些不对劲。可能的原因是什么?
// Signalling Thread
if (SetEvent(waitEvent))
consoleprintf(L"\r\nEvent Set.");
并且应该等待延迟时间或得到信号。但并不总是得到信号。
waitEvent = CreateEvent(
NULL, // default security attributes
FALSE, // auto-reset event
FALSE, // initial state is nonsignaled
TEXT("WaitEvent") // object name
);
for(;;)
{
dwWaitResult = WaitForSingleObject(waitEvent, // event handle
5000);
switch (dwWaitResult)
{
// Event object was signaled
case WAIT_OBJECT_0:
consoleprintf(L"\r\nSuccess.");
break;
case WAIT_FAILED:
//break;
case WAIT_ABANDONED:
consoleprintf(L"\r\nWait failed.");
break;
case WAIT_TIMEOUT:
consoleprintf(L"\r\nWait Timed out: %d", waitTime);
break;
default:
break;
}
}
【问题讨论】:
-
在有问题的线程上
ResetEvent和WaitForSingleObject之间的侧线程上没有SetEvent。这与您的描述和上述行为的可能原因相符。 -
另外,相反,在
WaitForSingleObject之后立即调用ResetEvent- 否则在控制台打印期间发生的 Set 可能会被重置破坏。 -
@500-InternalServerError 即使事件被自动重置,这个问题仍然存在。这还有意义吗?
-
那你有没有把 ResetEvent 调出来?
-
既然你给了这个事件一个名字,那么其他一些进程可能正在吃你的信号。您创建命名事件是否有原因?尽可能使用匿名事件。
标签: c multithreading winapi synchronization waithandle