死锁

死锁的现象:

1. 线程试图对同一个互斥量A加锁两次。这种情况主要是在编程时不经意之间发生的。当对互斥量加锁后,如果再次加锁导致该线程阻塞等待锁被释放,但是该锁其实就被线程自己占有了,因此造成了自己把自己死锁住了。解决方法:在加锁之前应该检查之前是否加过锁还未解锁;

2. 当线程要同时获得多个共享资源才能完成工作时,如线程1拥有A锁,请求获得B锁;线程2拥有B锁,请求获得A锁。解决方法:当线程不能获取所有的锁时,主动释放自己已经占有的锁,第二次请求加锁时采用trylock函数,如果trylock失败,则释放该线程已经占用的锁。

3.振荡。如在哲学家用餐模型中,为了避免死锁,做了如下规定:每个哲学家先拿自己左手边的筷子,然后再去拿右手边的筷子,如果不能同时得到两支筷子,则该哲学家放下手中已有的筷子。这种规定依然会因为振荡而产生死锁,例如:每个哲学家都同时拿上了左手边的筷子,然后都阻塞,都释放左手筷子;然后又同时去拿左手边的筷子,这样周而复始,一直进行下去,就是因为振荡而产生的死锁。解决方法:规定其中一位哲学家先拿右手边的筷子,再拿左手边的筷子即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值