Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WaitForThreadpoolWaitCallbacks立即返回,无需等待_C++_Multithreading_Winapi_Threadpool_Wait - Fatal编程技术网

C++ 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

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 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);