理解不了自旋锁

来源:7-3 线程同步之自旋锁

激发态电子

2019-08-18

对自旋锁的介绍完全听不懂
请问老师,自旋锁的线程会反复检查锁变量是否可用,然后呢?可用怎么样,不可用又怎么样?
直接就不会让出CPU了,就忙等待了,有点蒙。

当然我猜,这是一种线程的锁定,直到这个线程不用这个资源了,才会彻底解锁,让出线程。但是希望得到严谨的解答,谢谢

写回答

3回答

咚咚呛

2019-08-19

这个问题要从自旋锁的实现去回答。

自旋锁在不同语言都有不同的实现,但核心逻辑都是一样的,你可以看做是一个死循环去判断锁变量是否可用,如果可用则跳出循环,否则继续死循环。

逻辑如下:

void spin_lock(lock)
{
    while (test_and_set(lock, true));// 锁可用则返回,否则继续循环
}

需要注意的是,死循环是占用100%的CPU的,也即是不会让出CPU。

有一个跟死循环相关的程序员段子可以分享一下:

程序员小明和女朋友在机场候机,女生突然肚子疼了,小明在心疼之余掏出笔记本写了个四线程死循环提高CPU温度给女生暖肚子,女生非常感动,然后给自己买了一个暖宝宝。

希望对你有所帮助。

0
5
激发态电子
非常感谢!
2019-08-20
共5条回复

激发态电子

提问者

2019-08-20

多谢老师的解答,老师您列举的这几点,我是可以理解的。

主要纠结的点在于下图:

不明白生产者是怎样一直占有资源直到自己的num+1所有循环完成的。

消费者应该有机会抢到资源的使用权的,这样就和互斥锁没区别啦

//img.mukewang.com/szimg/5d5bf8a109a53a4107430497.jpg

0
3
激发态电子
回复
咚咚呛
num + 1执行完,有一个解锁操作,这时候消费者正在自旋等待锁,所以有机会抢到资源,就造成了线程切换,和互斥锁就一样了
2019-08-20
共3条回复

咚咚呛

2019-08-20

1. 加锁解锁的操作是和互斥锁一样的,但是这和锁的实现不冲突。

2. 加锁和解锁是为了使得别的线程不能进入临界区域,一个线程加锁了,另外一个线程就不能再对其加锁,只能等锁的释放。

3. 自旋锁会死循环等待,互斥锁会让出CPU。

4. 至于互斥锁性能比自旋锁性能差的原因,和同学的理解一样,是由于线程切换带来的开销导致的。但是不能片面的认为自旋锁效率一定会比互斥锁高,在一些复杂场景下,互斥锁具有更高的效率。


0
0

(新版)计算机基础,计算机组成原理+操作系统+网络

编程之前先学这门课,系统补足计算机基础知识,夯实编程地基

7739 学习 · 1580 问题

查看课程