何时调用CloseHandle
When to call CloseHandle?
我有一个主线程,它接收需要一些时间的操作。所以我创建了一个线程并将作业委托给它。这个执行函数是由主线程在接收作业时调用的。每个作业都实现此执行。
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个线程完成时,等待_for_multiple_objects,然后在每个句柄上调用CloseHandle看起来不错。
但在这种情况下我该怎么办?
[我想这个问题对所有操作系统都有意义,所以也要标记它们。]
如果您真的不在乎等待线程,那么您确实可以在创建线程后立即关闭句柄。
然而,我强烈建议不要那样做。您应该始终等待线程退出(最好是以干净、定义明确的方式)。如果没有提前完成,请等待程序退出时生成的每个线程。总是,没有例外
不要让main
不知道其他线程是否仍在运行。如果需要的话,用强硬的方式杀死他们(尽管最好是让他们以可控的方式优雅地离开,然后等待)。
如果不等待线程完成,您可能会看到退出时出现奇怪的崩溃情况。或者更糟的是,您可能看不到它们,并且只有用户/客户抱怨配置文件损坏了百分之一(或者更糟糕的是,他们的数据文件)1。现在想象一下,他们能够一步一步地展示他们在做什么,你可以看出他们做的每件事都是正确的,不可能出问题
幸运的是,要弄清楚崩溃是由于仍在运行的工作线程访问某个对象(或全局状态)造成的,该对象刚刚被退出的主线程显式或隐式地释放。
当然,你的立场可能是工作线程在程序完成之前很久就已经退出了,所以为什么要麻烦呢。然而,那是在玩俄罗斯轮盘赌。
1这不是虚构的,但我以前确实看到过一些事情发生。
您可以使用unique_ptr<HANDLE, CloseHandle> threadHandle
-假设您有一个合适的位置来存储/放置threadHandle
变量。。
或者,如果你实际上并不需要句柄,只需在启动线程后立即关闭它,因为只有当你以后关心线程时,句柄才真正有用。
来自MSDN CreateThread
文档:
线程对象将保留在系统中,直到线程已终止,并且通过对的调用关闭了它的所有句柄CloseHandle。
如果在以后的某个阶段需要线程的句柄,则可以始终使用OpenThread
来获得"新"句柄。当然,假设你也没有"失去"threadId
。
当然,正确的C++解决方案是使用std::thread
。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 谁负责为线程句柄调用 CloseHandle()
- 在作为函数参数的句柄上调用 CloseHandle
- 何时调用CloseHandle
- 在析构函数中调用CloseHandle会导致运行时内存错误,即如何正确关闭结构/类中的文件句柄