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

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值