线程死锁

1. 什么是死锁
   死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。
2. 死锁要产生必须具备四个必要条件:
1.  互斥条件 
2.  请求和保持条件 
3.  不可剥夺条件  
4.  环路等待条件。

由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

3. 如何避免死锁,常见的算法和原理
时刻检查自己写的程序有没有在跳出时忘记释放锁。
如果自己的模块可能重复使用一个锁,建议使用嵌套锁。
对于某些锁代码,不要临时重新编写,建议使用库里面的锁,或者自己曾经编写的锁。
如果某项业务需要获取多个锁,必须保证锁的按某种顺序获取,否则必定死锁。
编写简单的测试用例,验证有没有死锁。
编写验证死锁的程序,从源头避免死锁。
int pthread_mutex_lock(pthread_mutex_t *mutex)\\将阻塞式加锁

int pthread_mutex_trylock(pthread_mutex_t *mutex)\\换为非阻塞式等待
两个线程同时用两个锁时,两边使用的顺序应该相同。不可交叉使用
//线程A:
    pthread_mutex_lock(&mutex_lock1) //加锁mutex_lock1
    //代码
    pthread_mutex_lock(&mutex_lock2) //加锁mutex_lock2
    //代码
    pthread_mutex_unlock(&mutex_lock1)//解锁mutex_lock1
    //代码
    pthread_mutex_unlock(&mutex_lock2)//解锁mutex_lock2


//线程B:(应与线程A的顺序相同)
    pthread_mutex_lock(&mutex_lock1) //加锁mutex_lock1
    //代码
    pthread_mutex_lock(&mutex_lock2) //加锁mutex_lock2
    //代码
    pthread_mutex_unlock(&mutex_lock1)//解锁mutex_lock1
    //代码
    pthread_mutex_unlock(&mutex_lock2)//解锁mutex_lock2
//如果无法要为所有的锁定顺序比较困难,就可以使用pthread_mutex_trylock函数替换pthread_mutex_lock以避免死锁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值