网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

一个死锁问题分析-创新互联

问题:

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

10年积累的网站设计、成都网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有东平免费网站建设让你可以放心的选择与我们合作。

加了编译选项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)

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


标题名称:一个死锁问题分析-创新互联
文章路径:http://bjjierui.cn/article/ecihp.html

其他资讯