美文网首页js css html
一个死锁示例分析

一个死锁示例分析

作者: 码农练功房 | 来源:发表于2022-12-05 17:55 被阅读0次

问题:

源程序来源于GItHub:recipes/Factory_deadlock.cc at master · chenshuo/recipes (github.com)

加了编译选项REPRODUCE_BUG后会导致死锁,为什么会死锁呢?

个人分析:

这个程序一开始没有看懂,主要是有个知识点自己忽略了:

对象的析构是同步的,当最后一个指向xshared_ptr离开其作用域的时候,x会同时在同一个线程析构。这个线程不一定是对象诞生的线程。

主要过程为:

  1. main线程创建了一个Stock对象叫MS,该对象地址为0x56354caa90c0
  2. 由于该对象的引用计数为0,于是立即调用定制的析构函数deleteStock
  3. 主线程在deleteStock中会休眠500毫秒,此时thrB线程创建了一个Stock对象也叫MS,该对象地址为0x7f3020000b20,这个对象覆盖了之前main线程创建的对象在哈希表中的位置。
  4. main线程从休眠中醒来,继续执行,发现此时指向thrB线程创建的Stock对象的引用计数值为2。
  5. main线程再次休眠500毫秒。
  6. thrB线程执行结束,发现其创建的Stock对象的引用计数值为1(在main线程中),所以该对象不会在thrB中析构。
  7. main线程从休眠中唤醒,发现此时指向thrB线程创建的Stock对象【0x7f3020000b20】的引用计数值为1。离开作用域后,引用计数为0,这个对象要在main线程中被析构。
  8. main线程里面再次调用定制的析构函数deleteStock,于是导致死锁。
main: Stock[0x56354caa90c0] MS
main: stock 0x56354caa90c0
main: deleteStock[0x56354caa90c0]
thrB: Stock[0x7f3020000b20] MS
thrB: stockB 0x7f3020000b20
use_count = 2
thrB: stockB destructs
use_count = 1
main: deleteStock[0x7f3020000b20]
WARNING: mutex_ is already locked by this thread, deadlock will happen.

如果没有互斥锁的话,结果会这样:

main: Stock[0x55c6ae0d40c0] MS
main: stock 0x55c6ae0d40c0
main: deleteStock[0x55c6ae0d40c0]
thrB: Stock[0x7fa980000b20] MS
thrB: stockB 0x7fa980000b20
use_count = 2
thrB: stockB destructs
use_count = 1
main: deleteStock[0x7fa980000b20]
main: ~Stock[0x7fa980000b20] MS
main: ~Stock[0x55c6ae0d40c0] MS
main :~Thread

参考文献:

  1. C++ shared_ptr相关技术 - 简书 (jianshu.com)

相关文章

  • Java-多线程(四)死锁

    死锁 死锁示例

  • 一个死锁示例分析

    问题: 源程序来源于GItHub:recipes/Factory_deadlock.cc at master · ...

  • Java--死锁以及死锁的排查

    最近遇到了死锁的问题,所以这里分析并总结下死锁,给出一套排查解决方案。 死锁示例一 清单一 清单一代码有点长,但是...

  • 死锁示例

    死锁示例 由于两个锁对象lock1,lock2是static只存在一份,导致两个线程执行时会相互等待已经被获得的琐...

  • java并发--java死锁

    本篇结构: 前言 什么是死锁 产生死锁的必要条件 死锁的代码示例 死锁排查 如何避免死锁 总结 一、前言 今天被问...

  • JVM_JMM: 死锁的检测

    死锁的示例代码: 通过jconsole来检测死锁: 名称: Thread-1状态: java.lang.Class...

  • SimpleDateFormat是线程不安全的

    示例 结果 可以看到,结果不对,也死锁了。

  • 死锁的示例

  • Java死锁示例

    以下是Java中死锁的两个示例,一个是同步代码块嵌套,一个是同步方法互相调用。 示例说明 同步代码块嵌套 这个例子...

  • 异常引起的死锁

    [toc] 介绍 一个json异常导致的死锁分析。同事某天求助帮忙分析一个死锁dump,按照之前查找临界区的方法,...

网友评论

    本文标题:一个死锁示例分析

    本文链接:https://www.haomeiwen.com/subject/vkivfdtx.html