[C++11]析构函数中std::thread::join()卡住无法退出


join()卡住分析

直接原因: 与main thread退出时候发生死锁。

main结束时候 -->CRT locktable.lock

        -->~

         -->join等待其他线程退出

其他线程结束时候

->等待main释放CRT locktable.lock -->与main线程死锁


上面的问题在vs2015中不存在了。

大笑其实是输出log导致的。比较奇怪


线程函数中加入log输出为什么会导致std::thread::join()卡住无法退出呢?


《Linux系统编程手册》--信号处理器函数一章中写道设计型号处理函数的原则

对于异步信号安全函数必须遵守原则:

1.不可调用 不可重入函数。例如printf()scanf()等使用静态变量进行内部记账函数,malloc

2.不可引用非原则的全局变量

确保异步信号处理函数安全的两种选择:

1.确保信号处理函数代码是可重入的,并且调用的函数也是可以重入的。特别注意在一个信号处理函数中读写全局变量需要是一步执行完的操作,否则构成不可重入

lock;

g_a++

        read g_a;

g_a++;

unlock;

2.当主程序执行不安全函数或者信号处理函数去更新全局数据结构时,阻塞信号的传递。


当在线程函数或者线程调用的信号处理函数 中,使用printf()或者其他平台log()等输出log时候,则被可重入被破坏了。导致线程出息未知问题,从而std::thread::join()卡住无法退出


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值