我习惯于使用好的旧WinAPI调用CreateThread(),并使用等待函数(例如WaitForSingleObject() )检查线程的状态,一旦线程用WAIT_OBJECT_0发出信号,我就使用CloseHandle().关闭线程
最近,我决定转移到beginthread,并在某种程度上避免未初始化的crt和可能发生的意外内存泄漏的风险。
这样做让我很困惑。
endthread()的确切用途是什么?为什么当我在主函数中调用CloseHandle()时,在线程执行之后,CloseHandle()会以无效的句柄崩溃?beginthread返回的句柄吗?endthread,正如我所理解的,一旦函数超出作用域,线程就会自动调用它,所以应该在超出作用域之前调用它吗?CloseHandle() 1。线程从哪里获得对其句柄的引用/实例。2.如果我坚持使用endthread(),那么它应该是线程中的最后一个命令吗?谢谢
编辑:描述 MSDN文件的泄漏,这里。
发布于 2015-07-06 23:26:31
正如David的评论中所述,您可以简单地将代码更改为使用CreateThread。当您第一次使用使用每个线程数据的函数时,Visual运行时将自动初始化C++的每个线程数据。
当线程结束时,CRT还会自动释放每个线程的数据,因此使用CreateThread不会导致内存泄漏。有一个例外,如果下列所有条件都为真,那么每个线程数据都不会自动释放:
请注意,即使在您的情况下所有这些都是正确的,内存泄漏也不会很严重,除非您正在创建一个长期存在的应用程序,该应用程序在其生命周期内创建并销毁了数十万个线程。
如果仍然希望使用CRTs线程创建函数(_beginthread/_beginthreadex),则应遵循以下指导原则:
_beginthread返回的句柄。使用_beginthread时,线程句柄会在线程退出时自动关闭,这可能会在_beginthread返回之前发生。您不能在WaitForSingleObject中安全地使用它,因为在调用此函数之前,线程可能已经退出。如果您想要将线程句柄用于任何操作,请使用_beginthreadex。_beginthread返回的句柄。CRT将自动完成它,正如前面所描述的,在您有机会之前可能会这样做。_beginthreadex返回的句柄。CRT不会自动为你做这件事,所以这是你自己的责任。_endthread或_endthreadex,除非您想要快速和异常地终止线程。尽管CRT将释放它自己的每个线程数据,但是不会调用任何线程对象的C++析构函数。它的行为类似于_exit如何在不调用析构函数的情况下结束进程。_beginthread或_beginthreadex的函数返回。这将导致调用C++析构函数作为函数返回的正常部分。https://stackoverflow.com/questions/31244131
复制相似问题