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()卡住无法退出