最近项目中用到一些多线程的知识,涉及到一个线程需要锁住多个资源的情况,这就会涉及到多线程的死锁问题。特此总结一下

死锁产生的方式有好几种,并不是只有一个线程涉及多个锁才会出现死锁的情况,单个锁也有可能出现死锁。

1、第一种常见的情况是加锁之后没有解锁。有可能是lock之后真的忘了unlock,这种比较少见也容易发现。但是有时候程序并不是跟我们预想的一样一帆风顺的走完流程,可能是在lock和unlock之间的代码出现了异常退出,这样就造成了加锁之后没有解锁,后续程序对该锁的请求无法实现,导致死锁等待。

解决方法:在c++语言中,就是利用所谓的Autolock局部对象,在该对象的构造函数中lock,在析构函数中unlock,因为是在栈中创建的对象,系统会自动执行析构函数,即使程序异常退出也会执行析构函数从而释放资源。

2、第二种是同一个线程中对同一个资源多次调用lock函数。有的互斥锁对象没有线程所有权属性,比如windows下的信号量Semaphores ,即一个线程获得某个信号量后,在他释放该信号量之前,他不能再次进入信号量保护的区域。如果信号量的计数只有1,同一个线程调用WaitForSingleObject两次,程序就会阻塞在第二次调用处造成死锁。

3、第三种情况就是我们通常所说的情况。有两个线程,线程1和线程2,有两个锁A和B,线程1持有A然后等待B,与此同时线程1持有B然后等待A。两个线程都不释放拥有的锁,也都获取不到等待的锁。

避免死锁一般针对的是第三种情况。

1、尽量不在同一个线程中同时锁住两个临界资源,不过如果业务要求必须这样,那就没办法。

2、有一种可行的办法是,多个线程对多个锁的加锁顺序一样,这样就不会发生死锁,比如线程1线程A资源加锁,再对B资源加锁,线程2也使用相同的顺序,就不会产生死锁。

3、还有一种可行的方案是一次性获取所有需要获取的锁,如果不能一次性获取则等待。我想了一下linux下可以用pthread_mutex_trylock函数来实现,伪代码如下(针对两个锁而言):

while (true)
{pthread_mutex_lock(&mutexA);if (0 == pthread_mutex_trylock(&mutexB)){//成功获取所有锁break;}else{//释放持有的锁,继续等待pthread_mutex_unlock(&mutexA);//延时一段时间再继续请求usleep(10*1000);}}//业务代码
...
pthread_mutex_unlock(&mutexA);
pthread_mutex_unlock(&mutexB);

4、还有一种方法是使用待定超时机制,如果等待一个锁太久没得到,就释放自己拥有的所有锁,避免死锁。这个方法感觉指标不治本,是处理死锁发生后的情况而不是有效的预防死锁。

5、听说还有一种是死锁检测机制。这个比较虚,太深奥咱们也搞不懂,也不知道怎么检测的,最好还是在预防方面下功夫。

总结避免死锁的几种方法相关推荐

  1. python中threading产生死锁_什么是死锁,如何避免死锁(4种方法)

    当两个线程相互等待对方释放资源时,就会发生死锁.Python 解释器没有监测,也不会主动采取措施来处理死锁情况,所以在进行多线程编程时应该采取措施避免出现死锁. 一旦出现死锁,整个程序既不会发生任何异 ...

  2. tp3.2 不能提交到action方法_什么是死锁,如何避免死锁(4种方法)

    当两个线程相互等待对方释放资源时,就会发生死锁.Python 解释器没有监测,也不会主动采取措施来处理死锁情况,所以在进行多线程编程时应该采取措施避免出现死锁. 一旦出现死锁,整个程序既不会发生任何异 ...

  3. 减少数据库死锁的8种方法

    从客观上讲,在大型数据库应用系统中,死锁问题不可能完全避免的.但是如我们有良好的编码习惯与意识,完全可以尽量减少死锁情况的发生,从而提高应用程序性能. 下面我们讲解一下在大型数据库系统开发过程中应该注 ...

  4. 解开硬盘逻辑死锁的一种有效方法 (转)

    解开硬盘逻辑死锁的一种有效方法 (转)[@more@] 解开硬盘逻辑死锁的一种有效方法 西安市西北工业大学418信箱(710072)  肖华勇 一·序言 不知道你是否曾碰到过从软盘和硬盘都启动不了计算 ...

  5. linux下死锁怎么解决方法,死锁,解决死锁的4种基本方法

    死锁,解决死锁的4种基本方法 死锁 这个概念是操作系统里面很重要的内容,前阵子面试字节被问到了,太久没复习,面经变凉经. 死锁(Deadlock),又被翻译为死结.是操作系统或软件运行的一种状态,在多 ...

  6. 解决死锁的4种基本方法

    解决死锁的4种基本方法 1.预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件 2.避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁 3.检测死锁:允许死锁的发 ...

  7. 深入探究死锁的三种处理方法

    死锁的处理方法我们以火灾为例.要想火灾处理有三种办法,(1)提前预防,使环境没有火灾产生的环境,如降低周边温度,周边没有氧气等等(2)当出现火灾时,我们及时救火.(3)如果火灾离消防队比较远,等消防队 ...

  8. Java死锁检测的三种方法

    方法一:jstack 进程号 首先使用jps查看Java进程编号,然后使用jstack查看进程信息,出现下述信息表示出现了死锁.jstack会在最后给出进程的分析信息,表示出现了死锁. 方法二:使用图 ...

  9. C#线程同步的几种方法

    在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的.它只能在变量一级做 ...

最新文章

  1. python数据库框架_Python数据库及ORM框架对比选择
  2. HDU - 6610 Game(带修莫队)
  3. SQL学习之使用视图
  4. 基于小波变换的数字图像处理(MATLAB源代码)
  5. 德鲁伊 oltp oltp_深入研究内存中OLTP表的非聚集索引
  6. 字节跳动杯2018中国大学生程序设计竞赛-女生专场题解
  7. DataTemplate 以及Template Selector 学习笔记
  8. dynamips虚拟服务:找不到指定设备
  9. 年底将至 怎么向国外客户开口催单 附话术模板
  10. win7升级RDP至8.1
  11. Fortran相关图书推荐
  12. linux转录组kegg注释,KEGG pathway 注释整理
  13. 数字逻辑课上如何制作FPGA游戏?
  14. 学习Java编程入门书籍
  15. 电阻电路的等效变化(Ⅱ)
  16. 《基于C/S模式的android手机与PC机通信系统的开发》项目
  17. IE安全系列:IE的自我介绍 (II)
  18. 如何截取视频中的中间部分视频,批量去除片头片尾
  19. 微软在盈利前确认裁员
  20. linux gpio喂狗驱动

热门文章

  1. 家用计算机调制解调器作用,调制解调器有什么用
  2. junit 单元测试 相关问题记录问题: Error:(16, 6) java: 不兼容的类型: com.gyf.test.Test无法转换为java.lang.annotation.Annotati
  3. 西安住房公积金查询网站
  4. nxd无盘怎么设置服务器网卡,网众NxD 6.0无盘系统的客户端缓存设置
  5. ps如何“移花接木”,有什么相关教程吗
  6. 计算机毕业设计asp.net的酒店管理系统(源码+系统+mysql数据库+Lw文档)
  7. 雷军的“赌局”:10亿美元All in金山云,赴美上市能赢阿里腾讯吗?
  8. 实现摄像头在内网、外网、GB28181实现“视频监控/直播”的常用几种方式
  9. jQuery第四天案例
  10. 【水汐の蓝桥】 1949年的国庆节(10月1日)是星期六。 今年(2012)的国庆节是星期一。 那么,从建国到现在,有几次国庆节正好是星期日呢?