程序崩溃调试记录和总结

1. 多线程访问共享资源没有加锁

错误提示:Segmentation fault!
解决办法:

  • 多线程读不需要加锁
  • 多线程同时读写则需要加锁
    加锁的方法有互斥量、信号量、读写锁、记录锁、互斥量和条件变量结合提供的事件通知机制。
    C++11里则有,lock_guard,unique_lock.两者都是在构造的时候加锁,析构的时候加锁。但unique_lock提供更多的特性,比如可以指定它在构造的时候不加锁,在需要的时候再调用.lock()加锁。如果和condition_variable结合使用只能用unqiue_lock.

2. 指针变量在定义的时候没有初始化为nullptr,或者在某个时候执行变成了悬挂指针,导致不可预知的错误。

错误提示:Segmentaion fault!
解决方法:

  • 指针变量在声明的时候初始化为nullptr,在使用的时候判断if(!ptr)
  • 仔细检查代码,杜绝出现悬挂指针。

3. std::thread在joinalble状态下析构会导致terminate

错误提示::terminate called without an active exception. Aborted
解决办法:

  • 创建thread的时候调用detach使之变为分离线程
  • thread执行之后调用join等待thread正常结束
    但是在写代码量多了之后,有时候会在甘个代码分支过早退出而引起thread析构而没运行到join语句,这样就会导致terminate;
    示例代码如下:
  1. void foo()
  2. {
  3. //do something;
  4. }
  5. int main()
  6. {
  7. std::thread t(foo);
  8. if(true)return1;
  9. t.join();
  10. return0;
  11. }

代码8时t以foo构造并运行,此是为joinable状态,代码9时程序退出,导致t在t.join()之前析构,thread在joinable状态析构下会导致terminate。~thread函数在cplusplus说明如下:
If the thread is joinable when destroyed, terminate() is called.

原文链接: https://www.cnblogs.com/arhlong/p/5367255.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    程序崩溃调试记录和总结

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/231619

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午3:05
下一篇 2023年2月13日 下午3:06

相关推荐