如何正确关闭取消挂起任务的 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
是否开始执行 - 取消尚未调用的此项的回调。
我有一个关于关闭 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
是否开始执行 - 取消尚未调用的此项的回调。