linux:死锁

标签:
7人阅读 评论(0) 收藏 举报
分类:

在实现线程互斥中,我们是使用了互斥锁,那如果不合理的使用互斥锁,会带来什么危害呢?比如加锁之后却忘记解锁,会导致以下结果:

1.内存泄露
2.死锁

线程互斥请看上一篇博客:https://blog.csdn.net/dangzhangjing97/article/details/79947187

1.死锁是什么

比如你在锁门时,把门锁了,然后出去了,把钥匙丢了,回来之后,那门就开不开了,门就一直会处于死锁状态
在线程中,死锁是指给一个临界区加了锁之后,忘记解锁,那线程就会一直处在临界区出不来,因为没有解锁

死锁现象
跟死循环的现象一样,程序会一直处于运行状态

2.死锁场景

1.一个线程已经获取到锁,现在又去获取锁,就会出现死锁(调用lock的时候,如
果当前的mutex变量已经被加锁,lock函数就会阻塞等待,一直等到unlock)

2.现在有两个线程,分别为消线程A和线程B,线程A获取了1号锁,线程B获取了2
号锁,现在A尝试获取2号锁,线程B尝试获取3号锁,这个时候双方都无法拿到对
方的锁,并且会在获取锁的函数(lock)中阻塞等待
      程序跑起来之后,因为两个线程互相去获取对方已经持有的锁,导致环路等
  待,出现死锁

如果线程和锁的数目更多了,就会使死锁问题更容易出现

3.死锁的4个必要条件

1.互斥条件
一个锁每次只能被一个线程或者进程使用;
2.请求和保持条件
一个进程或者线程因为请求某个锁而阻塞时,不会释放自己已经拿到的锁;
3.不剥夺条件
进程或者线程已经拿到的锁,自己未使用完毕之前,其他线程或者进程不能强行剥夺;
4.环路等待条件
若干进程或者线程之间形成一种头尾相接的循环等待锁的关系;

4.如何避免死锁

使临界区的代码注意以下几个方面,可有效的避免死锁的发生:

1.尽量使临界区的代码短
2.代码逻辑清晰,尽量在临界区中的代码不要存在函数调用等复杂的函数关系或者复杂的变量关系,也尽量不要申请其他的互斥资源,应使代码简单,一眼就可以看懂其表达的意思;
3.应使临界区的代码的执行速度尽量快,如果代码的执行速度很快的话,就算出现死锁,程序也可能表现不出来;

查看评论

Linux 死锁例子

死锁是在编写多线程并发时候所需要考虑的问题,在多线程软件使用多个互斥锁来保护共享资源时,如果设计不合理会出现多个锁相互嵌套并且都在等待彼此的锁被释放,这样就会出现死锁现象,让系统挂起一直相互等待下去。...
  • huang3838438
  • huang3838438
  • 2014-01-08 16:01:28
  • 2399

linux--死锁(产生死锁的原因、条件和避免方法)

一、死锁的概念:       如果一组进程(或线程)中的每一个进程(或线程)都在等待仅由该组进程中的其他进程(或线程)才能引发的事件,那么该组进程(或线程)是死锁的(Deadlock)。 二、产生死...
  • rannianzhixia
  • rannianzhixia
  • 2017-06-10 19:30:17
  • 375

浅谈Linux死锁检测

浅谈Linux死锁检测
  • baidu_35534327
  • baidu_35534327
  • 2016-10-25 21:37:02
  • 554

Linux--死锁产生条件及避免死锁算法

一.什么是死锁? 所谓死锁是指在多道程序系统中,一组进程中的每一个进程均无限期的等待被该组进程中的另一个进程所占有且永远不会释放的资源,这种现象称系统处于死锁状态。   二.死锁产生的原因? 1.竞争...
  • sayhello_world
  • sayhello_world
  • 2017-03-31 16:33:00
  • 1555

linux死锁检测的一种思路

linux死锁检测的一种思路 http://www.cnblogs.com/mumuxinfei/p/4365697.html 前言:    上一篇博文讲述了pstack的使用和原理...
  • zdy0_2004
  • zdy0_2004
  • 2015-03-26 16:58:50
  • 6107

Linux多线程如何避免死锁

1、线程死锁产生的必要条件:(1)互斥条件:一个资源每次只能被一个进程使用。 (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3)不可剥夺条件:进程已获得的资源,...
  • u010889616
  • u010889616
  • 2015-08-23 23:09:40
  • 1030

Linux下死锁的必要条件及如何避免死锁

死锁产生的原因: (1) 因为系统资源不足。 (2) 进程运行推进的顺序不合适。 (3) 资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会...
  • My_heart_
  • My_heart_
  • 2016-09-10 23:58:14
  • 1345

[linux]死锁问题查找问题的相关命令

死锁问题查找问题的相关命令 1、jps查看进程 2、jstack
  • szwangdf
  • szwangdf
  • 2016-06-28 17:30:21
  • 3159

Linux下用gdb定位死锁方法

linux下多线程可能会遇到死锁问题,死锁问题一般是两个线程争抢某种资源导致的,比如线程1已经拥有A锁,它同时还想获取B锁,而此时线程2已经拥有B锁,同时去获取A锁,这样线程1和2就因为无法获得各自想...
  • u014069683
  • u014069683
  • 2014-03-12 22:21:22
  • 2806

linux-C下的死锁检测(pthread_mutex_)

多线程死锁问题比较麻烦,因为工作需要自己写了一个检测程序,实现原理比较简单~~...
  • bgylde
  • bgylde
  • 2016-11-09 09:59:22
  • 881
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 1151
    排名: 4万+
    文章分类
    最新评论