gpt4 book ai didi

c++ - 什么时候调用 CloseHandle?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:08 27 4
gpt4 key购买 nike

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

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 看起来不错。

但在这种情况下我该怎么办?

[ 我想这个问题与所有操作系统都相关,所以也标记它们。 ]

最佳答案

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

但是,我强烈建议不要这样做。您应该始终等待线程退出(最好以干净、定义明确的方式)。如果没有更早完成,请等待程序退出时生成的每个线程。始终如一,无一异常(exception)。
不要离开main不知道其他一些线程是否仍在运行。如果需要,用困难的方式杀死它们(尽管最好让它们以可控的方式优雅地退出,然后等待)。

如果您等待线程完成,您可能会看到奇怪的退出时崩溃情况。或者更糟的是,您可能看不到它们,并且只有用户/客户提示配置文件被损坏的概率为一百次(或者更糟的是,他们的数据文件)1 。现在想象一下,他们能够逐步演示他们在做什么,并且您可以看出他们所做的一切都是正确的,并且不可能出现任何问题。
祝您好运,确定崩溃是由于仍在运行的工作线程访问某个对象(或全局状态),该对象刚刚被退出的主线程释放,无论是显式还是隐式地被 CRT 释放。

当然,您的立场可能是工作线程会在程序结束之前很久就退出,所以何必呢。然而,那是在玩俄罗斯轮盘赌。


1这不是虚构的,而是我以前亲眼目睹的事情。

关于c++ - 什么时候调用 CloseHandle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465681/

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