【发布时间】:2011-05-12 08:21:39
【问题描述】:
我一直在玩 Windows 的(新的?)线程池 API。我一直在遵循Using the Thread Pool Functions 中的示例,并且一直在认真研究 MSDN 上的 API。关于清理小组,我有些不明白。
调用SetThreadpoolCallbackCleanupGroup()时,第三个参数描述为
如果在释放关联对象之前取消清理组,则要调用的清理回调。调用
CloseThreadpoolCleanupGroupMembers()时调用该函数。
如果我的理解是正确的,这意味着您可以取消待处理的工作/io/计时器项,并要求它在这些对象中的每一个上调用清理回调函数而不是原来的队列工作/ io/timer 项的回调。这听起来很酷,我想使用它。
不幸的是,用于相关回调的 PTP_CLEANUP_GROUP_CANCEL_CALLBACK 类型未在 MSDN 上记录,相关示例未使用此功能。
将法律掌握在自己手中,我将定义追溯到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 );
问题:如果您必须进行有根据的猜测,您认为ObjectContext 和CleanupContext 指的是什么?
我的第一个猜测是CleanupContext 是您在启动清理时指定的:因此是CloseThreadpoolCleanupGroupMembers() 的第三个参数。我很有信心这个猜测是正确的,因为 API 调用是如此直接相关。
我的第二个猜测是ObjectContext 是您在提交工作/io/计时器项时指定的:这是CreateThreadpoolWork() 等人的第二个参数。我完全不确定情况是否如此。
有人可以证实这些猜测是正确的吗?有人用过这个功能吗?
【问题讨论】:
标签: c++ c windows multithreading threadpool