gpt4 book ai didi

c++ - 取消WIN32线程池中计划的work/io/timer项

转载 作者:可可西里 更新时间:2023-11-01 12:07:25 24 4
gpt4 key购买 nike

我一直在研究 Windows 的(新的?)线程池 API。我一直在关注 Using the Thread Pool Functions 中的示例我一直在仔细研究 MSDN 上的 API。关于清理组,我有些不明白。

调用 SetThreadpoolCallbackCleanupGroup() 时,第三个参数描述为

The cleanup callback to be called if the cleanup group is canceled before the associated object is released. The function is called when you call CloseThreadpoolCleanupGroupMembers().

如果我的理解是正确的,这意味着您可以取消挂起的工作/io/timer 项目并要求它对这些对象中的每一个调用清理回调函数而不是最初的队列工作/io/timer 项的回调。这听起来很酷,我想使用它。

不幸的是,MSDN 上没有记录用于相关回调的 PTP_CLEANUP_GROUP_CANCEL_CALLBACK 类型,相关示例未使用此功能。

将法律掌握在自己手中,我将定义追溯到 WinNT.h 并发现了以下内容。

typedef VOID (NTAPI *PTP_CLEANUP_GROUP_CANCEL_CALLBACK)(
__inout_opt PVOID ObjectContext,
__inout_opt PVOID CleanupContext
);

删除这个看起来很滑稽的声明中的废话会让你:

typedef void ( __stdcall * PTP_CLEANUP_GROUP_CANCEL_CALLBACK )
( void* ObjectContext, void* CleanupContext );

问题:如果您不得不进行有根据的猜测,您认为 ObjectContextCleanupContext 指的是什么?

我的第一个猜测是 CleanupContext 是您在启动清理时指定的内容:因此是 CloseThreadpoolCleanupGroupMembers() 的第三个参数。我非常有信心这个猜测是正确的,因为 API 调用是如此直接相关。

我的第二个猜测是 ObjectContext 是您在提交 work/io/timer 项时指定的内容:这是 CreateThreadpoolWork() 的第二个参数等。我完全不确定情况是否如此。

有人可以确认这些猜测是正确的吗?有人用过这个功能吗?

最佳答案

您使用 SetThreadpoolCallbackCleanupGroup 函数指定的可选清理回调将针对与调用 CloseThreadpoolCleanupGroupMembers 时尚未关闭的同一回调环境关联的每个对象调用。回调的第一个参数,即对象上下文,是您在使用 TrySubmitThreadpoolCallback、CreateThreadpoolWork 等函数时指定的 void* 参数的值。回调的第二个参数,清理上下文,是您在使用 CloseThreadpoolCleanupGroupMembers 函数时指定的 void* 参数的值。

要记住的重要一点是,是否为特定对象调用清理回调与该对象是否具有未完成的回调无关。仅针对尚未关闭的对象调用它。换句话说,完全有可能调用对象的回调,然后为同一对象调用清理回调。

例如,如果您使用 CreateThreadpoolWork 函数创建了一个工作对象,并且在调用 CloseThreadpoolCleanupGroupMembers 之前未能调用 CloseThreadpoolWork 函数,那么将为该对象调用清理回调,即使该对象的回调已经执行。未能调用 CloseThreadpoolWork 不是错误,因为 CloseThreadpoolCleanupGroupMembers 将关闭与清理组关联的所有对象。

另一个需要注意的转折点是在使用 TrySubmitThreadpoolCallback 函数时。这是一个更简单的 CreateThreadpoolWork 版本,因为您不必考虑创建、提交和关闭工作对象。诀窍是线程池会在执行回调后自动关闭工作对象。这意味着只有在其回调仍未决且您在调用 CloseThreadpoolCleanupGroupMembers 以取消任何未决回调时指定 TRUE 时,才会为此对象调用清理回调。

关于c++ - 取消WIN32线程池中计划的work/io/timer项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com