前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++多线程-死锁

C++多线程-死锁

作者头像
cwl_java
发布2020-01-15 10:50:45
6930
发布2020-01-15 10:50:45
举报
文章被收录于专栏:cwl_Javacwl_Java

相信有过多线程编程经验的朋友,都吃过死锁的苦。除非你不使用多线程,否则死锁的可能性会一直存在。为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2)模块使用锁的差异 (3)版本之间的差异 (4)分支之间的差异 (5)修改代码和重构代码带来的差异

不管什么原因,死锁的危机都是存在的。那么,通常出现的死锁都有哪些呢?我们可以一个一个看过来,

忘记释放锁
代码语言:javascript
复制
void data_process()  
{  
    EnterCriticalSection();  
  
    if(/* error happens */)  
        return;  
  
    LeaveCriticalSection();  
} 
单线程重复申请锁
代码语言:javascript
复制
void sub_func()  
{  
    EnterCriticalSection();  
    do_something();  
    LeaveCriticalSection();  
}  
  
void data_process()  
{  
    EnterCriticalSection();  
    sub_func();  
    LeaveCriticalSection();  
}
双线程多锁申请
代码语言:javascript
复制
void data_process1()  
{  
    EnterCriticalSection(&cs1);  
    EnterCriticalSection(&cs2);  
    do_something1();  
    LeaveCriticalSection(&cs2);  
    LeaveCriticalSection(&cs1);  
}  
  
void data_process2()  
{  
    EnterCriticalSection(&cs2);  
    EnterCriticalSection(&cs1);  
    do_something2();  
    LeaveCriticalSection(&cs1);  
    LeaveCriticalSection(&cs2);  
}  
环形锁申请
代码语言:javascript
复制
/* 
*             A   -  B 
*             |      | 
*             C   -  D 
*/  

假设有A、B、C、D四个人在一起吃饭,每个人左右各有一只筷子。所以,这其中要是有一个人想吃饭,他必须首先拿起左边的筷子,再拿起右边的筷子。现在,我们让所有的人同时开始吃饭。那么就很有可能出现这种情况。每个人都拿起了左边的筷子,或者每个人都拿起了右边的筷子,为了吃饭,他们现在都在等另外一只筷子。此时每个人都想吃饭,同时每个人都不想放弃自己已经得到的一那只筷子。所以,事实上大家都吃不了饭。

总结: (1)死锁的危险始终存在,但是我们应该尽量减少这种危害存在的范围 (2)解决死锁花费的代价是异常高昂的 (3)最好的死锁处理方法就是在编写程序的时候尽可能检测到死锁 (4)多线程是一把双刃剑,有了效率的提高当然就有死锁的危险 (5)某些程序的死锁是可以容忍的,大不了重启机器,但是有些程序不行

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 忘记释放锁
  • 单线程重复申请锁
  • 双线程多锁申请
  • 环形锁申请
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档