1、 线程局部存储(TLS)实现
实现线程私有关键字:
- 对于GCC:__thread
- 对于MSVC:__declspec(thread)
2、 线程环境块(TEB)
保存线程的堆栈信息、线程ID等
CreateThread()和_beginthread()有什么不同?
- _beginthread()是对CreateThread()的包装,它最终还是调用CreateThread()来创建线程
- 调用CreateThread()和ExitThread()可能会造成内存泄漏,这是为什么呢?
1、 CreateThread()并没有申请_tiddata的结构,但是它在调用strtok()函数时,strtok()它会在一开始去获取_tiddata的时候,发现_tiddata结构不存在,它会去申请并且初始化这个结构
2、 但是呐,ExitThread函数并不会去释放_tiddata这样的一个结构(因为它根本就不知道有它的存在)
3、 一般不会发生内存泄漏的原因:当一个进程/线程开始或退出的时候,每个DLL的DllMain都会被调用一次,于是动态链接库版的CRT就由机会在DllMain中释放线程的_tiddata。【!!!DllMain只有当CRT是动态链接版的时候才起作用,静态链接CRT是没有DllMain的!!!】
多线程动态链接CRT: /MD /MDd
多线程静态链接CRT: /MT /MTd
CRT: C Runtime
在使用CRT时,尽量使用_beginthread()/_beginthreadex()/_endthread()/_engthreadex()这组函数来创建进程