Man*_*ndo 3 c winapi multithreading synchronization waithandle
WaitForSingleObject即使事件已经发出信号,有时也会等待超时.
信令线程SetEvent()每次都会收到成功.但是,发出信号的线程并不总是听到信号.如果我SetEvent()在信令线程中添加冗余,问题就会消失.
显然这里有些不对劲.可能的原因是什么?
// Signalling Thread
if (SetEvent(waitEvent))
consoleprintf(L"\r\nEvent Set.");
Run Code Online (Sandbox Code Playgroud)
应等待延迟时间或发出信号.但并不总是得到信号.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Ray*_*hen 15
由于您正在创建命名事件,因此知道名称的其他进程可以访问该事件.其他过程也可能在等待事件,导致它吃掉信号.除非有某些原因导致事件需要对其他进程可见,否则您应该NULL作为事件名称传递.这会创建一个其他进程无法访问的匿名事件.
请注意,如果给事件命名,那么您将遇到这样的问题:如果程序的两个副本正在运行,它们将使用相同的事件,这将产生同样的问题.
| 归档时间: |
|
| 查看次数: |
3153 次 |
| 最近记录: |