Windows线程
程序员文章站
2022-07-05 12:39:08
...
线程组成
- 线程内核对象:操作系统用他来管理线程,存放线程统计信息
- 线程栈:用于维护线程执行时所需的所有函数参数和变量
线程退出方式
- 线程退出最好的方式是通过线程函数返回
- 线程通过ExitThread终止运行时,C/C++资源不会被销毁
- 线程被TerminateThread杀死(此过程会以异步的方式进行),除非线程所属进程退出否则被杀死的线程的堆栈不会被释放。经测试,被杀死的线程的C++资源也不会被自动销毁(现象同被杀死的线程自己调用ExitThread一样)
- 线程所属进程以ExitProcess或TerminateProcess方式被杀死,线程的清理工作也不能正常进行
#include <windows.h>
#include <cstdio>
#include <cassert>
class CTest
{
public:
CTest() { printf("Create\n"); }
~CTest() { printf("Destroy\n"); }
};
DWORD WINAPI ThdFun(PVOID pValue)
{
CTest Test;
ExitThread(0);
return 0;
}
int main()
{
auto hThread = CreateThread(nullptr, 0, ThdFun, nullptr, 0, nullptr);
assert(hThread);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
system("pause");
return 0;
}
/*
运行结果:输出"Create"而不会输出"Destroy"
备注:就算主进程退出也不会输出"Destroy"
*/
_beginthreadex
- 标准C运行库设计的时间比线程出现的时间早了很多,所以标准C运行库设计的时候没有考虑线程安全性。为了保证C/C++多线程应用程序正常运行,创建线程的时候必须使用
_beginthreadex
而不是CreateThread
- 由
_beginthreadex
产生的线程都有自己专用的_tiddata
内存块,他们是从C/C++运行库的堆上分配的 -
_beginthreadex
会在内部调用CreateThread
-
_beginthreadex
失败返回0 - 不要忘记使用
CloseHandle
来关闭_beginthreadex
返回的句柄 -
_beginthreadex
的参考文档:https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/beginthread-beginthreadex
推荐阅读