什么时候调用CloseHandle?

2024-04-29

我有一个主线程,它接收需要一些时间的操作。所以我创建一个线程并将工作委托给它。当主线程接收作业时,将调用此执行函数。每个作业都执行此执行。

Return_type execute( Arguments_here) {

// if a file read case
DWORD threadId;
HANDLE hThread = CreateThread( 
        NULL,                   // default security attributes
        0,                      // use default stack size  
        MyAsyncFileRead,       // thread function name
        details,          // argument to thread function 
        0,                      // use default creation flags 
        &threadId);   // returns the thread identifier
// else do other work
}

现在,由于我不想在主线程上等待,因此我不调用 WaitForSingleObject。 [我对Windows线程的了解很低。所以如果这不是必需的,请原谅我]

如果我等待线程关闭,它将等待我的主线程。我不想那样做。 那么我什么时候调用 CloseHandle ?

当一个人手头上有大约 10 个作业,并且创建了 10 个线程,然后等待所有 10 个线程完成时,那么 wait_for_multiple_objects 然后在每个句柄上调用 CloseHandle 看起来不错。

但这种情况我该怎么办呢?

[我认为这个问题与所有操作系统相关,因此也标记它们。 ]


如果你真的不关心等待线程,你确实可以在创建线程后立即关闭句柄。

但是,我强烈建议不要这样做。你应该always等待线程退出(最好以干净、定义良好的方式)。如果没有提前完成,请等待程序退出时生成的每个线程。总是如此,无一例外。
不要离开main不知道其他线程是否仍在运行。如果需要的话,用艰难的方式杀死他们(不过最好让他们以受控的方式优雅地退出,然后等待)。

If you don't wait for threads to finish, you may see weird crash-on-exit conditions. Or worse, you might not see them, and only have users/customers complain that one in a hundred times the config file gets corrupted (or worse, a data file of theirs)1. Now imagine that they are able to demonstrate step-by-step what they're doing, and you can tell that they do everything correctly, and there is no way something could go wrong.
Good luck figuring out that the crash is due to a still-running worker thread accessing some object (or global state) which was just deallocated by the exiting main thread, either explicitly or implicitly by the CRT.

当然,您的立场可能是工作线程将在程序完成之前很久就退出,所以为什么要麻烦呢。然而,那就是玩俄罗斯轮盘赌。


1This is not fiction, but something I've actually seen happen before.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候调用CloseHandle? 的相关文章

随机推荐

  • 比较 std::functions 是否相等?

    如何比较两个 C 11std functions with operator 并返回true如果两者都说functions 引用同一个函数指针吗 你实际上可以让它工作 target template
  • BNF 可以处理远期消费吗?

    最近我发现了 python 模块pyparsing 一个通过编写来解析数据的绝佳工具grammar 而不是解析器 我对上下文无关语法的概念很陌生 所以请纠正这个问题中的任何错误假设 Pyparsing 可以实现 BNF 巴科斯 诺尔范式 h
  • F# 中序列的递归函数

    这是一个相当微不足道的问题 但快速的谷歌搜索并没有给我答案 为序列编写递归函数的标准方法是什么 对于列表 您可以使用空列表和头 尾模式进行模式匹配 序列的等效项是什么 没有标准的方法可以做到这一点 因为您很少为序列编写递归函数 您应该查看各
  • Mongoose:find() 忽略重复值

    我有一只 聊天 猫鼬Schema它具有以下属性 const schema mongoose Schema recipient type mongoose Types ObjectId required true ref User sende
  • Oracle 连接池类

    我想在 Helper 类中为 Oracle DB 设置连接池 public class DbConnection Data source for the pooled connection private static OracleData
  • 数据库优化命令

    在用户可以下订单的数据库中 最好有一个包含地址的新表 还是每个订单的标题中都有地址数据 这不仅涉及用户 及其地址 还涉及您所销售产品的价格和其他信息 这些信息可能会发生变化after订单已下达 但订单本身必须保持完整 一般来说 有两种方法
  • 如何获取Android 13当前的壁纸?

    似乎getDrawable of WallpaperManager在 Android 13 上没用 因为用户无法获取READ EXTERNAL STORAGE对此的许可 有什么办法可以获取 API 级别 33 上的当前壁纸吗 我的意思是不降
  • 新的 Delphi Rad Studio XE2 中的 FireMonkey (FMX) 包含哪些功能的详细信息?

    我听说德尔福全新 Rad Studio XE2有一个东西叫做火猴这将允许相同的代码构建 Windows 32 Windows 64 和MacOS应用程序 如果这是真的 那么这是巨大的 在哪里可以获得有关 FireMonkey 的技术文档 E
  • 如何预取 Wagtail 帖子标签?

    我有大约 10 个帖子 它生成大约 100 个查询来获取帖子标签 这taggit下面使用的 Wagtail 库supportprefetch related https github com alex django taggit blob
  • 将图像上传到 spring mvc 中的文件夹

    我尝试将图像上传到我的资源中的文件夹 resouces images demo jpg 但它无法运行 你能帮忙在春天上传到我的资源吗mvc 如果我上传到 C test demo jpg 没关系 我的样本 String filename Fi
  • Rails 3.1 资产管道:忽略来自 gem 的资产

    我不太确定实际行为是什么 所以我的第一个问题是 来自 gem 在我的例子中 Spree 的资产 例如 javascript 是否总是被编译 我不使用 Spree 的 javascript 因此不希望编译它们 我不需要它们applicatio
  • R Doplot() 坐标定位器()

    我绘制了 2 个 fasta 序列的点图 使用 seqinr 包中的 dotPlot 我需要从图中提取一些值 x y Dotplot 输出是图像 通用点图可能就是这个 例如 我需要局部对齐的开始和结束值 由紫色线表示所以这里有一个例子 l
  • 了解 JAXB @XmlRootElement 注释

    我正在使用教程在这里 http www vogella com articles JAXB article html jaxb用于理解 JAXB 当作者开始创建文档的根时 作者开始如下 This statement means that c
  • 在rails生产环境中禁用服务器端缓存

    我即将部署一个包含敏感数据的应用程序 因此 不应将任何数据存储到磁盘上 有没有办法禁用服务器端缓存 我找不到任何 我碰巧遇到了这个问题 并且假设您不再需要答案 但是 我相信您正在寻找的是以下内容 config action controll
  • 在javascript中将字符串转换为数字

    我想解析包含经度和纬度的用户输入 我想做的是将字符串强制转换为数字 保留其符号和小数位 但我想做的是当用户输入无效时显示一条消息 我应该遵循哪一个 parseFloat x second new Number x third x fourt
  • 我的 ViewModel 列表中每个项目的数据验证

    要使用正则表达式进行验证 我通常这样做 In my ViewModel RegularExpression MyRegex ErrorMessageResourceName MyErrorMessage public string MyFi
  • 写入 BigQuery 时处理卡住

    我正在使用云数据流将数据从 Pub Sub 消息导入到 BigQuery 表 我正在使用 DynamicDestinations 因为这些消息可以放入不同的表中 我最近注意到该进程开始消耗所有资源 并且消息表明该进程被卡住开始显示 Proc
  • Python 词干分析器问题:词干错误

    你好 我正在尝试用 python 词干分析器来词干 我尝试了 Porter 和 Lancaster 但他们也有同样的问题 他们无法正确阻止以 er 或 e 结尾的单词 例如 它们源于 computer gt comput rotate gt
  • Knockout 将 css 类绑定到观察到的模型属性

    我想将 divs css 类绑定到视图模型的属性 如下所示 div 但这会产生结果 div class 0 1 2 3 这是视图模型 myViewModel selectedPriority ko observable High Compa
  • 什么时候调用CloseHandle?

    我有一个主线程 它接收需要一些时间的操作 所以我创建一个线程并将工作委托给它 当主线程接收作业时 将调用此执行函数 每个作业都执行此执行 Return type execute Arguments here if a file read c