【发布时间】:2015-09-23 11:57:56
【问题描述】:
我习惯于使用良好的旧 WinAPI 调用 CreateThread(),并使用等待函数检查线程的状态,例如 WaitForSingleObject(),一旦使用 WAIT_OBJECT_0 发出线程线程信号,我使用 CloseHandle(). 将其关闭
最近我决定搬到beginthread 并以某种方式避免未初始化crt 和可能发生的意外内存泄漏的风险。
这样做让我很困惑。
-
endthread()的确切用途是什么?为什么当我在 main 函数中调用CloseHandle()时,线程执行后,CloseHandle()会因句柄无效而崩溃? - 我应该关闭
beginthread返回的句柄吗? -
endthread,据我所知,一旦我的函数超出范围,线程会自动调用它,所以我应该在超出范围之前调用它吗? - 根据msdn,endthread已经调用了
CloseHandle()1.线程从哪里获得对其句柄的引用/实例。 2. 如果我坚持使用endthread(),它应该是线程中的最后一个命令吗?
谢谢
编辑: 描述泄漏的 MSDN 论文,here。
【问题讨论】:
-
您可以免费使用
CreateThread。未初始化 CRT 的危险很久以前就被消除了。至于你的代码有什么问题,只有你自己能看到。您忘记附加 MCVE。 -
@DavidHeffernan 所以你认为 80 字节的泄漏是可以接受的! ;)
-
@deviantfan Hans Passant 在这里多次声明。正如他常说的,如果这个问题很久没有解决,如何从 MSVC 访问系统线程池?例如:stackoverflow.com/questions/2100589/beginthread-vs-createthread
-
无论你选择哪个调用,如果你需要对返回的句柄进行操作,就永远不要使用
_beginthread。这在_beginthread, _beginthreadex 的文档中得到了很好的解释。 -
每个线程数据可能泄漏的一种情况是与在 Windows XP(或更早版本)下运行的 CRT 的静态版本链接的可执行文件。与 CRT 的 DLL 版本链接的任何内容、与 CRT 的静态版本链接的 DLL 或在 Server 2003 或 Vista 或更高版本下运行的任何内容都没有泄漏。
标签: c++ multithreading winapi