我有3个不同的线程,它们使用WindowsSetEvent
API来分别设置一个事件。
DWORD thFunc1(LPVOID)
{
...
SetEvent(event1);
...
}
DWORD thFunc2(LPVOID)
{
...
SetEvent(event2);
...
}
DWORD thFunc3(LPVOID)
{
...
SetEvent(event3);
...
}
第四个线程正在使用WaitForMultipleObjects
API等待所有这些事件。
DWORD thCatch(LPVOID)
{
...
DWORD ret = WaitForMultipleObjects(3, arrHandles, FALSE, INFINITE);
...
}
我的问题有两个:
- 如果3个线程在几乎相同的时间戳发出事件信号,是否保证事件的接收顺序与发送顺序相同
- 如果问题1的答案是否定的,那么有没有任何方法可以使用Windows API实现这一点
如有任何意见,我们将不胜感激。
WaitForMultipleObjects
API调用在多个对象进入信号状态时做出单个承诺:
如果多个对象被发出信号,该函数将返回数组中第一个被发出信号的句柄的索引。
无法通过WaitForMultipleObjects
调用确定多个对象的信号发送顺序。
如果事件发生的顺序很重要,您将不得不在其他地方记录这些信息。您可以使用带有原子推送和弹出操作的单链表,并在新条目到达时发出事件信号。