Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading 如何正确关闭WINAPI线程池以取消挂起的任务_Multithreading_Winapi_Threadpool - Fatal编程技术网

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

Multithreading 如何正确关闭WINAPI线程池以取消挂起的任务,multithreading,winapi,threadpool,Multithreading,Winapi,Threadpool,我有一个关于关闭WINAPI线程池的问题 假设我使用清理组初始化了一个线程池,并使用SubmitThreadpoolWork将一些任务推送到线程池中。 我正在任务的回调函数中调用CloseThreadPoolTask 当前线程池队列中有正在执行的任务和挂起的其他任务 现在,为了关闭线程池,我想使用CloseThreadpoolCleanupGroupMembers函数而不挂起队列中的任务来完成,但我仍然想获得挂起任务的回调,以释放其用户分配的资源(一些资源随任务参数一起提供)。 我在这条线上看到

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

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

当前线程池队列中有正在执行的任务和挂起的其他任务

现在,为了关闭线程池,我想使用CloseThreadpoolCleanupGroupMembers函数而不挂起队列中的任务来完成,但我仍然想获得挂起任务的回调,以释放其用户分配的资源(一些资源随任务参数一起提供)。

我在这条线上看到:

我传递给清理组的回调(PTP_cleanup_group_CANCEL_回调)也将调用当前正在执行的工作对象(因为它们在执行期间仍然绑定到清理组)-显然我不希望发生这种情况。。。有没有一种方法可以在当前正在执行的任务上不调用cleanup cancel回调


谢谢

如果CreateThreadpoolWork的回调开始执行,则不会调用它的清理回调。或者,如果将调用项的取消回调-
PTP\u WORK\u回调将永远不会调用此项(之前和之后)。所以这里真的没有任何问题。或将被称为您的
PTP\u WORK\u CALLBACK
,或将被称为此项目的取消CALLBACK。这是相互排斥的。所以在包含非常严重错误的主题中回复。我可以建议您在
PTP\u WORK\u CALLBACK
开始时调用test insert
MessageBox
并在
CloseThreadpoolCleanupGroupMembers
之前调用另一个
MessageBox
。您可以确保如果
PTP\u WORK\u CALLBACK
begin executed-取消此项尚未调用的回调。

非常感谢您的回答!我已经根据你所说的对这件事进行了测试,我还有另外一点要说清楚。我使用了一个有1个线程的池,推送了5个任务,这些任务会休眠1分钟。调用CloseThreadpoolCleanupGroupMembers后,仅在线程完成其工作后调用cleanup Cancel回调,并且仅调用了4次(仅针对挂起的作业)