接收 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);
...
}
我的问题是双重的:
- 如果 3 个线程在几乎相同的时间戳发出事件信号,是否保证事件的接收顺序与发送顺序相同?
- 如果问题 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,并在新条目到达时发出事件信号。
我有 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);
...
}
我的问题是双重的:
- 如果 3 个线程在几乎相同的时间戳发出事件信号,是否保证事件的接收顺序与发送顺序相同?
- 如果问题 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,并在新条目到达时发出事件信号。