自旋锁

2020-05-18 15:52:14 浏览数 (2)

自旋锁的具体描述,可以看这里:

https://cloud.tencent.com/developer/article/1433362

自旋锁适合于锁被持有的时间比较短的场合,这样能避免线程调度的时候花费的成本(因为阻塞引起线程休眠,唤醒线程花费的代价可能比自旋锁忙等花费的更大)。

正如前面文章中所述,自旋锁一般作为底层的PV原语来实现其它类型的锁。自旋锁在非抢占式调度中非常有用。

1.提供互斥机制

2.阻塞中断

阻塞中断,在非抢占式调度非常重要,中断处理程序不会使系统陷入死锁状态,因为它需要获取已被加锁的自旋锁。在这种内核中,中断处理程序是不能休眠的,因为它只使用自旋锁。(不抢占,只能等待时间片用完,或者是)

自旋锁在用户层面而言,不被经常使用。APUE中这样写到自旋锁,从他的描述不难看出,不希望在用户层面使用自旋锁。

原文如下:

很多互斥量的实现非常高效,以至于应用程序采用互斥锁的性能与曾经采用自旋锁的性能基本是相同的。事实上,有些互斥量的实现在试图获取互斥量失败的时候会先自旋一段时间,只有在自旋计数到达某一阈值时才会休眠。这些因素,加上现代处理器的进步,使得上下文切换越来越快,也使得自旋锁只有在某些特定的情况下有用。

下面给出POSIX定义的有关自旋锁的接口。

他的接口和互斥量的接口基本类似,因此替换它们比较方便,但是正如前所述,不建议这么做。

需要注意的是,pthread_spin_lock函数在获取锁之前一直处于自旋状态,直到获取锁为止;而pthread_spin_trylock函数如果不能获取锁,那么立即返回EBUSY错误,它不自旋。

试图对没有加锁的自旋锁进行解锁,结果是未定义的;如果当前线程已经获取了自旋锁并加锁,继续加锁的结果也是未定义的。这有可能引起永久自旋。

0 人点赞