为什么WaitForSingleObject会错过信号?

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作为事件名称传递.这会创建一个其他进程无法访问的匿名事件.

请注意,如果给事件命名,那么您将遇到这样的问题:如果程序的两个副本正在运行,它们将使用相同的事件,这将产生同样的问题.