接收 Win32 事件的顺序

Order of receiving Win32 Events

我有 3 个不同的线程,每个线程使用 Windows SetEvent API 设置一个事件。

DWORD thFunc1(LPVOID)
{
  ...
  SetEvent(event1);
  ...
}
DWORD thFunc2(LPVOID)
{
  ...
  SetEvent(event2);
  ...
}
DWORD thFunc3(LPVOID)
{
  ...
  SetEvent(event3);
  ...
}

第 4 个线程正在使用 WaitForMultipleObjects API.

等待所有这些事件
DWORD thCatch(LPVOID)
{
  ...
  DWORD ret = WaitForMultipleObjects(3, arrHandles, FALSE, INFINITE);
  ...
}

我的问题是双重的:

  1. 如果 3 个线程在几乎相同的时间戳发出事件信号,是否保证事件的接收顺序与发送顺序相同?
  2. 如果问题 1 的答案是否定的,那么有没有什么方法可以使用 Windows APIs 来实现?

如有任何意见,我们将不胜感激。

当多个对象进入信号状态时,WaitForMultipleObjects API 调用做出单一承诺:

If multiple objects become signaled, the function returns the index of the first handle in the array whose object was signaled.

无法通过 WaitForMultipleObjects 调用确定向多个对象发送信号的顺序。

如果事件发生的顺序很重要,您将不得不在别处记录该信息。您可以使用带有原子推送和弹出操作的 singly linked list,并在新条目到达时发出事件信号。