gpt4 book ai didi

c++ - RegisterWaitForSingleObjectEx() 和几个 SetEvent()

转载 作者:行者123 更新时间:2023-11-28 07:26:36 26 4
gpt4 key购买 nike

我发现多个 SetEventRegisterWaitForSingleObjectEx() 有一个棘手的行为。

#include <windows.h>
#include <iostream>

using namespace System;
using namespace System::Drawing;
using namespace System::Threading;

VOID CALLBACK Callback(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
{
String^ string = gcnew String("");

Monitor::Enter(string->GetType());

//wait for 2 seconds
for(int i=1; i<=2;i++) {
Sleep(1000);
cout << i << " seconds \n";
}

Monitor::Exit(string->GetType());
}


void main()
{

HANDLE eventhandle = CreateEvent(
NULL, // default security attributes
FALSE, // manual-reset event
FALSE, // initial state is nonsignaled
TEXT("WriteEvent") // object name
);

//register the callback for the event
RegisterWaitForSingleObjectEx(eventhandle, Callback, nullptr, -1, WT_EXECUTELONGFUNCTION);

BOOL bEvented[3];
bEvented[0] = SetEvent(eventhandle);
//Sleep(10);
bEvented[1] = SetEvent(eventhandle);
//Sleep(10);
bEvented[2] = SetEvent(eventhandle);
cout << "event0 = " << bEvented[0] << ", event1 = " << bEvented[1] << ", event2 = " << bEvented[2] << " \n";

}

我设置了 3 次事件。所以,我希望回调被调用 3 次(如果我错了请纠正我)。但我只收到 2 个回调。

如果我取消注释行 //Sleep(10); ,我会得到 3 个回调。这里发生了什么?

我用的是Win7 64位

更新:

能否请您举例说明如何使用信号量实现此目的?

实际场景:

我有一个第三方库,我必须在其中注册一个 HANDLE 以获得有关事件发生的通知。大多数时候,我都能收到通知(在 HANDLE 上发出信号)。有时,我没有像预期的那样得到正确的“信号数量”。

我正在传递使用 CreateEvent() 创建的 HANDLE,并使用 RegisterWaitForSingleObjectEx() 为 HANDLE 注册回调。

我怀疑这种竞争条件是造成这种行为的原因。

如何克服这个问题?

最佳答案

SetEvent 已发出信号的事件是空操作。调用 SetEvent 的主线程与等待它的工作线程(并在等待满足时自动重置它)之间存在竞争条件。

很可能,当工作人员仍在运行第一个回调时,您设法调用了两次 SetEvent

关于c++ - RegisterWaitForSingleObjectEx() 和几个 SetEvent(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18664508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com