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

How to close correctly a WINAPI Thread pool cancelling pending tasks

我有一个关于关闭 WINAPI 线程池的问题。

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

当前线程池队列中有正在执行的任务和其他正在等待的任务。

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

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

我传递给清理组的回调 (PTP_CLEANUP_GROUP_CANCEL_CALLBACK) 也将调用当前正在执行的工作对象(因为它们在执行期间仍然绑定到清理组)- 显然我不不希望它发生...有没有办法在当前执行的任务上不调用清理取消回调?

谢谢!

如果开始执行 CreateThreadpoolWork 的回调,则不会调用它的清理回调。或者如果将调用项目的取消回调 - PTP_WORK_CALLBACK 将永远不会为此项目调用(之前和之后)。所以这里真的没有任何问题。或将被称为您的 PTP_WORK_CALLBACK 或将被称为此项目的取消回调。这是相互排斥的。所以在主题 Cancelling scheduled work/io/timer items in WIN32 thread pool 中回复包含非常严重的错误。我可以建议您在 PTP_WORK_CALLBACK 的开头测试插入 MessageBox 调用,并在 CloseThreadpoolCleanupGroupMembers 之前插入另一个 MessageBox 调用。并且您可以确定 PTP_WORK_CALLBACK 是否开始执行 - 取消尚未调用的此项的回调。