0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

自旋锁和互斥锁的区别有哪些

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-21 11:19 次阅读

自旋锁

自旋锁与互斥锁很相似,在访问共享资源之前对自旋锁进行上锁,在访问完成后释放自旋锁(解锁);事实上,从实现方式上来说,互斥锁是基于自旋锁来实现的,所以自旋锁相较于互斥锁更加底层。

自旋锁与互斥锁之间的区别:

  1. 实现方式上的区别:互斥锁是基于自旋锁而实现的,所以自旋锁相较于互斥锁更加底层;
  2. 开销上的区别:获取不到互斥锁会陷入阻塞状态(休眠),直到获取到锁时被唤醒;而获取不到自旋锁会在原地“自旋”,直到获取到锁;休眠与唤醒开销是很大的,所以互斥锁的开销要远高于自旋锁、自旋锁的效率远高于互斥锁;但如果长时间的“自旋”等待,会使得 CPU 使用效率降低,故自旋锁不适用于等待时间比较长的情况。
  3. 使用场景的区别:自旋锁在用户态应用程序中使用的比较少,通常在内核代码中使用比较多;因为自旋锁可以在中断服务函数中使用,而互斥锁则不行,在执行中断服务函数时要求不能休眠、不能被抢占(内核中使用自旋锁会自动禁止抢占),一旦休眠意味着执行中断服务函数时主动交出了CPU 使用权,休眠结束时无法返回到中断服务函数中,这样就会导致死锁!

初始化和销毁自旋锁

#include < pthread.h >

int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
int pthread_spin_destroy(pthread_spinlock_t *lock);

加锁和解锁

#include < pthread.h >

int pthread_spin_lock(pthread_spinlock_t *lock);
int pthread_spin_trylock(pthread_spinlock_t *lock);
int pthread_spin_unlock(pthread_spinlock_t *lock);
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • 线程
    +关注

    关注

    0

    文章

    489

    浏览量

    19500
收藏 人收藏

    评论

    相关推荐

    Linux高级编程---互斥

    在Linux系统里,有很多的应用,包括互斥,文件,读写等等,信号量其实也应该是的一种。
    发表于 01-13 10:07

    Linux驱动开发笔记-自旋和信号量

    :如果在写代码时,有以上的竞态发生,一定要注意进行互斥访问7.解决竞态的方法:中断屏蔽原子操作自旋信号量如何使用以上4个机制呢?1.中断屏蔽解决哪些情况的竞态:进程和进程的抢占中断和进程中断和中断
    发表于 08-30 18:08

    【MiCOKit试用体验】庆科MiCO系统篇(3)MiCO RTOS互斥

    本帖最后由 gjianw217 于 2015-10-25 15:45 编辑 在本帖子中,主要分析一下庆科MiCO RTOS的互斥,具体包括:OS互斥MiCO
    发表于 10-24 17:02

    信号量、互斥自旋

    信号量、互斥自旋http://bbs.edu118.com/forum.php?mod=viewthread&tid=488&fromuid=231(出处: 信盈达IT技术社
    发表于 08-29 09:48

    小熊派华为物联网操作系统LiteOS内核教程05-互斥

    本帖最后由 小熊派开源社区 于 2020-2-24 17:52 编辑 1. LiteOS的互斥1.1. 互斥锁在多任务环境下,往往存在多个任务竞争同一共享资源的应用场景,互斥
    发表于 01-19 11:02

    Linux内核同步机制的自旋原理是什么?

    自旋是专为防止多处理器并发而引入的一种,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打开中断标志位,不需要自旋
    发表于 03-31 08:06

    请问任务被挂起时会不会自动释放互斥

    请问,任务被挂起时,会不会自动释放互斥。也就是这个任务正在使用这个互斥,刚好被挂起了。
    发表于 07-16 05:52

    【HarmonyOS HiSpark AI Camera 】第三次回眸-鸿蒙的线程和互斥

    / ... ad-0000001050141770提供的API进行编程。多线程在多核处理器可以加快运行时间,在单核处理器上没有什么优势。线程同步,最常用的是互斥、条件变量、信号量和读写。我的这个例子里面,使用漏桶算法
    发表于 11-13 20:01

    BearPi-HM_Nano开发板鸿蒙OS内核编程开发——互斥

    BearPi-HM_Nano开发板鸿蒙OS内核编程开发——互斥本示例将演示如何在BearPi-HM_Nano开发板上使用cmsis 2.0 接口使用互斥来同步任务Mutex API分析
    发表于 04-09 10:02

    怎么在atmega128中实现自旋

    什么是自旋?有哪些缺陷?怎么在atmega128中实现自旋
    发表于 01-24 06:54

    鸿蒙内核实现用户态快速互斥Futex设计资料合集

    Futex(Fast userspace mutex,用户态快速互斥),系列篇简称 快 ,是一个在 Linux 上实现锁定和构建高级抽象如信号量和POSIX
    发表于 03-23 14:12

    如何在RK2206上使用鸿蒙LiteOS-M内核接口进行互斥编程开发

    实验内容本例程演示如何在小凌派-RK2206开发板上使用鸿蒙LiteOS-M内核接口,进行互斥编程开发。程序设计互斥也叫做互斥型信号量,
    发表于 08-05 16:28

    RT-Thread实现的互斥属性包括哪些

    * lock);函数返回 lock无效返回EINVAL,否则返回0或EPERM。互斥属性RT-Thread实现的互斥属性包括互斥
    发表于 08-12 15:06

    RTThread中POSIX兼容层自旋如何实现呢?

    RTThread中POSIX兼容层里自旋的加锁实现好像不太对。如代码所示:int pthread_spin_lock (pthread_spinlock_t *lock){
    发表于 02-01 15:54

    互斥锁和自旋锁的区别 自旋锁临界区可以被中断吗?

    互斥锁和自旋锁的区别 自旋锁临界区可以被中断吗? 互斥锁和自旋锁是在多线程编程中常用的锁机制,它
    的头像 发表于 11-22 17:41 404次阅读