我有一个关于关闭WINAPI ThreadPool的问题。
假设我已经使用清理组初始化了一个线程池,并使用SubmitThreadpoolWork将一些任务推送到线程池。 我在任务的回调函数中调用CloseThreadPoolTask。
目前,正在执行的任务和在线程池队列中待处理的其他任务。
现在,为了关闭线程池,我想使用CloseThreadpoolCleanupGroupMembers函数而不等待排队任务完成,但是我仍然想要回调待处理任务以释放其用户分配的资源(一些来了使用任务的参数)。
我在这个帖子中看到: Cancelling scheduled work/io/timer items in WIN32 thread pool
我已经传递给清理组的回调(PTP_CLEANUP_GROUP_CANCEL_CALLBACK)也将调用当前正在执行的工作对象(因为它们在执行期间仍然与清理组绑定) - 显然我不希望它发生。 ..是否有一种方法可以在当前正在执行的任务中调用清除取消回调?
谢谢!
答案 0 :(得分:0)
如果CreateThreadpoolWork的回调开始执行,则不会调用它的清理回调。或者如果要调用项目的取消回调 - 将永远不会为此项目调用PTP_WORK_CALLBACK
(之前和之后)。所以这里真的没有任何问题。或将被称为您的PTP_WORK_CALLBACK
或将被称为此项目的取消回拨。这是相互排斥的。所以回复主题Cancelling scheduled work/io/timer items in WIN32 thread pool包含非常严重的错误。我可以建议您在MessageBox
的开头调用PTP_WORK_CALLBACK
调用,并在MessageBox
之前调用另一个CloseThreadpoolCleanupGroupMembers
。并且您可以确保PTP_WORK_CALLBACK
是否开始执行 - 取消此项未被调用的回调。