jjzjj

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

coder 2024-06-22 原文

我一直在研究 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/

有关c++ - 取消WIN32线程池中计划的work/io/timer项的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. ruby-on-rails - has_one :through work?如何 - 2

    我有三个模型:classReleaseItem:pack_release_itemsendclassPack:pack_release_itemsendclassPackReleaseItem问题是,在执行期间,如果我将一个包添加到release_item,它并不知道该包是一个包。例如:Loadingdevelopmentenvironment(Rails2.1.0)>>item=ReleaseItem.new(:filename=>'MAESTRO.TXT')=>#>>pack=Pack.new(:filename=>'legion01.zip',:year=>1998)=>#>>i

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  8. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  9. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  10. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

随机推荐