自旋锁

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

https://blog.csdn.net/zy010101/article/details/83869140

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

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

1.提供互斥机制

2.阻塞中断

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

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

原文如下:

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

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++之this指针

    有个问题是刚开始学习C++的人都想知道的,那就是C++的类对象的大小是多少?可能的猜测是它所有数据成员的大小加上所有函数指针的大小,这样就是类的大小。我们来测试...

    zy010101
  • TCP拥塞控制基本原理

    版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/z...

    zy010101
  • C++之函数重载

    函数重载是:函数名相同,但是函数参数不同的函数之间的关系。函数重载只能通过函数参数的不同来实现,这包含参数个数不同和参数类型不同。 !!! 重载不...

    zy010101
  • 你所理解的Synchronized关键字对吗

    关于java中的Synchronized关键字是不是自旋锁?首先从OS级别来说它肯定不是,因为它用的是互斥锁,这个可以看openjdk源码可以发现它用的是mut...

    须臾之余
  • Java虚拟机对synchronized的优化

    锁的状态总共有四种,无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁,但是锁的升级是单向的,也就是说只能从低到...

    宇宙之一粟
  • 【java并发编程实战4】偏向锁-轻量锁-重量锁的那点秘密(synchronize实现原理)synchronized自旋锁偏向锁轻量锁重量锁小结

    在多线程并发编程中,synchronized一直都是元老级别的角色,人们都通常称呼它为重量锁,但是在jdk1.6版本之后,jdk就对synchronized做了...

    yukong
  • 奔三90后的“大”数据分析

    时间过得真快,又是新的一年,转眼间,第一批90后也已经是30岁的人了。岁月无情催人老,小时候我们都渴望长大,觉得长大很酷,但是到了长大了才发现,成年人的世界有多...

    用户6888863
  • Linux下TCP延迟确认(Delayed Ack)机制导致的时延问题分析

    同事随手写个压力测试程序,其实现逻辑为:每秒钟先连续发N个132字节的包,然后连续收N个由后台服务回显回来的132字节包...

    潘安群
  • Angular 页面元素的DOM级别的删除过程

    condition值切换的时候,对应的p节点区域会对应地显示和隐藏。p节点的隐藏,其实并不是通过css类实现,而是直接把DOM元素从HTML页面中删除来实现的。

    Jerry Wang
  • (2)JVM——Java 虚拟机运行时数据区域讲解

    凡人飞

扫码关注云+社区

领取腾讯云代金券