iga*_*l k 3 c++ winapi multithreading
我习惯使用旧的WinAPI调用CreateThread(),并使用等待函数检查线程的状态,例如WaitForSingleObject(),一旦发出线程线程信号WAIT_OBJECT_0,我使用它关闭它CloseHandle().
最近我决定转移beginthread并以某种方式避免未初始化的crt和可能发生的意外内存泄漏的风险.
这样做让我很困惑.
endthread()什么?为什么当我调用CloseHandle()main函数时,在执行线程后,CloseHandle()崩溃时会出现无效句柄?beginthread吗?endthread,据我所知,一旦我的功能超出范围,线程会自动调用,所以我应该在我超出范围之前调用它吗?CloseHandle()1.From线程从哪里获取其句柄的引用/实例.2.如果我坚持使用endthread(),它应该是线程中的最后一个命令吗?谢谢
编辑:这里描述泄漏的MSDN论文.
正如David Hefferman的评论中所述,您只需将代码更改回使用CreateThread即可.第一次使用使用每线程数据的函数时,Visual C++运行时(CRT)将自动初始化CRT的每个线程数据.
当线程结束时,CRT也会自动释放每线程数据,因此使用CreateThread不会导致内存泄漏.有一个例外,如果满足以下所有条件,那么每个线程数据不会自动释放:
请注意,即使在您的情况下所有这一切都是正确的,除非您创建一个长期存在的应用程序,在其生命周期内创建并销毁数十万个线程,否则内存泄漏不会很重要.
如果您仍想使用CRT线程创建函数(_beginthread/ _beginthreadex),则应遵循以下准则:
_beginthread.随着_beginthread线程句柄将自动关闭,当线程退出,这可能潜在之前发生_beginthread,甚至回报.您不能安全地将它与WaitForSingleObject一起使用,因为在调用此函数之前线程可能已经退出.如果你想使用线程句柄_beginthreadex代替任何用途._beginthread.CRT将自动执行,并且如前所述,可能会在您有机会之前执行此操作._beginthreadex在不再需要时,应始终关闭返回的句柄.CRT不会自动为您执行此操作,因此这是您自己的责任._endthread或_endthreadex除非你想快速和异常地终止线程.虽然CRT将释放其自己的每个线程数据,但不会调用任何线程对象的C++析构函数.它的行为类似于如何_exit在不调用析构函数的情况下结束进程._beginthread或_beginthreadex.这将导致C++析构函数被调用为函数返回的正常部分.