死锁一定会造成cpu使用率飙升吗?

这取决于锁的实现,通常锁有两种实现:

ps: 在一个角落看到这篇文章,记录一下;

1 拿不到锁的时候,忙等待,反复探测锁状态,直到拿到锁,进入临界区。这种情况会消耗CPU。
while (locked);

这种锁,称为自旋锁。比如pthread_spin_lock。

2 拿不到锁的时候,放弃CPU,休眠,离开运行队列,这种情况不会消耗CPU。
while (locked) sleep(1);

这种锁,称为休眠锁。pthread_mutex就是这种锁。也是最常用的锁。

当然通常不会直接使用sleep实现,因为sleep会导致释放锁后,等锁的线程不能及时醒来干活儿。一般会借助系统调用,比如linux上会使用futex,这个调用可以让等锁线程休眠直到被释放锁的线程唤醒它。等锁线程会执行FUTEX_WAIT休眠, 而unlock的线程会执行FUTEX_WAKE唤醒休眠的等锁线程。

if (locked) futex(FUTEX_WAIT...);
so,由于自旋锁不会放弃CPU,没有调度开销(进出运行队列),性能要好于休眠锁,只是等锁的时候CPU是100%,所以适用于临界区比较短的场景。

facebook的folly库,实现了一种混合的锁,先自旋一定的次数,然后执行sleep放弃cpu。可以避免异常情况下,持锁进程长时间不释放导致的CPU开销问题。
java的synchronized也是一种混合锁(jdk1.6引入锁升级后),所以死锁也不会造成cpu飙升的问题。

文章参考:http://www.dewen.net.cn/q/13297/线程死锁是不是cpu资源一定会居高不下

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值