程序员的自我修养(十五)-线程 - TLS

    xiaoxiao2022-07-14  133

    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()这组函数来创建进程

    最新回复(0)