线程同步之死锁

造成死锁的两种情况

1、对共享资源锁了2次。

while(1)
{
    pthread_mutex_lock(&mutex);
    printf("HELLO ");
    pthread_mutex_lock(&mutex);
}

如上,锁了两次,此时现象是 输出了一遍HELLO,便不动了

分析:输出HELLO后, pthread_mutex_lock(&mutex);又要加锁,加锁的话,就要先等上一把锁解锁,否则就处于阻塞状态,而上一把锁就是他本身,他本身又没有解锁,所以就一直处于阻塞状态了。

所以,为避免这种情况,需要加锁后,访问完数据,立马解锁。

2、线程1拥有A锁,请求获得B锁,线程2拥有B锁,请求获得A锁。

分析:线程1拥有A锁,请求B锁,但是,B锁被线程2占用,所以,线程1阻塞;

同样,线程2拥有B锁,请求A锁,但是,A锁被线程1占用,所以,线程2阻塞;这样就造成了死锁。

解决方法1:首先使用trylock,避免阻塞;当不能取得所有锁的时候,放弃已经占有的锁,假设线程1,lock了A锁,然后trylockB锁,发现B锁被被占用,则线程1放弃A锁,那么,线程2在获得了B锁后,接着又可以获得A锁了,获取共享资源后,线程2释放A锁和B锁,线程1就可以获取A锁和B锁了。//当得不到所有所需资源的时候,放弃已经获得的资源,等待。

解决方法2:多个线程获取锁的顺序保持一致,即都获取A锁,再获取B锁。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值