在windows开发中,我们有两种创建线程的方式:
第一种:Windows API CreateThread() 来创建线程;用 ExitThread() 来退出线程;
第二种:调用MSVC CRT的函数 _beginthread() 或 _beginthreadex() 来创建线程;用 CRT的 _endthread() 来退出线程。
而实际上,_beginthread() 的内部实现,也是通过调用 CreateThread() 来实现的创建线程。
这两种方式的区别在于,CreateThread() 在静态链接时,会无法释放 _tiddata 导致内存泄漏。
demo(设置:C/C++ -> 代码生成 -> 运行库 -> MTd):
// 设置:C/C++ -> 代码生成 -> 运行库 -> MTd
#include <iostream>
#include <Windows.h>
#include <process.h>
void TestCreateThread() {
std::cout << "test CreateThread" << std::endl;
ExitThread(0);
}
int main()
{
while (1) {
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)TestCreateThread, 0, 0, 0);
Sleep(1);
}
return 0;
}
观察输出结果,发现内存泄漏
而使用 _beginthread() 则不存在该问题。