理解不了自旋锁
来源:7-3 线程同步之自旋锁

激发态电子
2019-08-18
对自旋锁的介绍完全听不懂
请问老师,自旋锁的线程会反复检查锁变量是否可用,然后呢?可用怎么样,不可用又怎么样?
直接就不会让出CPU了,就忙等待了,有点蒙。
当然我猜,这是一种线程的锁定,直到这个线程不用这个资源了,才会彻底解锁,让出线程。但是希望得到严谨的解答,谢谢
写回答
3回答
-
这个问题要从自旋锁的实现去回答。
自旋锁在不同语言都有不同的实现,但核心逻辑都是一样的,你可以看做是一个死循环去判断锁变量是否可用,如果可用则跳出循环,否则继续死循环。
逻辑如下:
void spin_lock(lock) { while (test_and_set(lock, true));// 锁可用则返回,否则继续循环 }
需要注意的是,死循环是占用100%的CPU的,也即是不会让出CPU。
有一个跟死循环相关的程序员段子可以分享一下:
程序员小明和女朋友在机场候机,女生突然肚子疼了,小明在心疼之余掏出笔记本写了个四线程死循环提高CPU温度给女生暖肚子,女生非常感动,然后给自己买了一个暖宝宝。
希望对你有所帮助。
052019-08-20 -
激发态电子
提问者
2019-08-20
多谢老师的解答,老师您列举的这几点,我是可以理解的。
主要纠结的点在于下图:
不明白生产者是怎样一直占有资源直到自己的num+1所有循环完成的。
消费者应该有机会抢到资源的使用权的,这样就和互斥锁没区别啦
032019-08-20 -
咚咚呛
2019-08-20
1. 加锁解锁的操作是和互斥锁一样的,但是这和锁的实现不冲突。
2. 加锁和解锁是为了使得别的线程不能进入临界区域,一个线程加锁了,另外一个线程就不能再对其加锁,只能等锁的释放。
3. 自旋锁会死循环等待,互斥锁会让出CPU。
4. 至于互斥锁性能比自旋锁性能差的原因,和同学的理解一样,是由于线程切换带来的开销导致的。但是不能片面的认为自旋锁效率一定会比互斥锁高,在一些复杂场景下,互斥锁具有更高的效率。
00
相似问题