C++ WaitForThreadpoolWaitCallbacks立即返回,无需等待
WaitForThreadpoolWaitCallbacks立即返回而不等待,这是我做错了什么C++ WaitForThreadpoolWaitCallbacks立即返回,无需等待,c++,multithreading,winapi,threadpool,wait,C++,Multithreading,Winapi,Threadpool,Wait,WaitForThreadpoolWaitCallbacks立即返回而不等待,这是我做错了什么 HANDLE hEvent = CreateEvent(0, FALSE, FALSE, 0); ... PTP_WAIT Pwa = CreateThreadpoolWait(WaitCallback, NULL, NULL); SetThreadpoolWait(Pwa, hEvent, NULL); // Here we should wait until hEvent gets signale
HANDLE hEvent = CreateEvent(0, FALSE, FALSE, 0);
...
PTP_WAIT Pwa = CreateThreadpoolWait(WaitCallback, NULL, NULL);
SetThreadpoolWait(Pwa, hEvent, NULL);
// Here we should wait until hEvent gets signaled
WaitForThreadpoolWaitCallbacks(Pwa, FALSE);
// Here we should get after hEvent gets signaled
WaitForThreadpoolWaitCallbacks从不等待,在WaitForThreadpoolWaitCallbacks之后执行继续。但是,如果事件收到信号,回调仍然会以任何方式被调用。无论之前是否调用了WaitForThreadpoolWaitCallbacks,该事件也会收到信号
在SetThreadPoolWait中,将超时设置为NULL以永远等待
指向文件时结构的指针,该结构指定绝对值或
等待操作应超时的相对时间。如果这
参数指向正值,表示绝对时间
自1601年1月1日(UTC)起,每隔100纳秒。如果这
参数指向负值,表示时间量
相对于当前时间等待。更多关于时间的信息
值,请参见文件时间
如果此参数指向0,则等待立即超时。如果这
参数为NULL,等待将不会超时
Edit:调用SetThreadpoolWait
本身似乎不会将线程池等待项(PTP_Wait)设置为挂起状态。如果是这种情况,WaitForThreadpoolWaitCallbacks
将在CancelPendingCallbacks参数设置为FALSE时等待。也可能是“取消待定”一词具有误导性。挂起也可能意味着已等待的事件已发出信号,但没有可用的工作线程来启动回调方法
另一个不太可能的原因可能是
WaitForThreadpoolWaitCallbacks
有缺陷 似乎有一个竞争条件:
从
问题在于,wait对象仅在关联的同步对象收到信号或超时过期时才将回调排队。在这些事件发生之前,不会有回调排队,等待函数也不会等待任何东西。解决方案是首先使用空指针值调用SetThreadpoolWait,告诉wait对象停止等待,然后调用WaitForThreadpoolWaitCallbacks以避免任何竞争条件:
问题是WaitForThreadpoolWaitCallbacks会等待任何已排队的回调,但如果事件尚未设置,则没有任何内容已排队,也没有任何内容可等待。这篇文章讨论的是关机时的竞争条件,这很有趣,但不是直接的问题。
SetThreadpoolWait(w.get(), nullptr, nullptr);
WaitForThreadpoolWaitCallbacks(w.get(), TRUE);