如何正确关闭WINAPI线程池取消挂起的任务

时间:2016-10-31 06:52:22

标签: multithreading winapi threadpool

我有一个关于关闭WINAPI ThreadPool的问题。

假设我已经使用清理组初始化了一个线程池,并使用SubmitThreadpoolWork将一些任务推送到线程池。 我在任务的回调函数中调用CloseThreadPoolTask​​。

目前,正在执行的任务和在线程池队列中待处理的其他任务。

现在,为了关闭线程池,我想使用CloseThreadpoolCleanupGroupMembers函数而不等待排队任务完成,但是我仍然想要回调待处理任务以释放其用户分配的资源(一些来了使用任务的参数)。

我在这个帖子中看到: Cancelling scheduled work/io/timer items in WIN32 thread pool

我已经传递给清理组的回调(PTP_CLEANUP_GROUP_CANCEL_CALLBACK)也将调用当前正在执行的工作对象(因为它们在执行期间仍然与清理组绑定) - 显然我不希望它发生。 ..是否有一种方法可以在当前正在执行的任务中调用清除取消回调?

谢谢!

1 个答案:

答案 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是否开始执行 - 取消此项未被调用的回调。