作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现多个 SetEvent
与 RegisterWaitForSingleObjectEx()
有一个棘手的行为。
#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/
我发现多个 SetEvent 与 RegisterWaitForSingleObjectEx() 有一个棘手的行为。 #include #include using namespace Syste
我是一名优秀的程序员,十分优秀!