news 2026/4/18 21:49:29

【OS】互斥锁和自旋锁的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【OS】互斥锁和自旋锁的区别
阻塞行为

互斥锁:加锁失败时,线程会进入阻塞状态,释放CPU资源,由操作系统调度其他线程执行。

自旋锁:加锁失败时,线程会忙等待,持续循环检查锁的状态,不释放CPU资源。

适用场景

互斥锁:适用于临界区资源访问时间较长或存在阻塞操作的情况,如文件I/O、数据库操作等。

自旋锁:适用于临界区资源访问时间短,且线程竞争不激烈的情况,如内核态驱动程序开发、轻量级数据结构保护等。(临界区资源不是指RTOS的进入临界区,那个是需要关中断的)

性能特点

互斥锁:在锁竞争激烈时,通过让线程睡眠来减少CPU浪费,但上下文切换会带来额外开销。

自旋锁:避免了上下文切换的开销,但在高竞争下可能导致CPU资源浪费。

底层实现

互斥锁:内核调度机制+等待队列。

自旋锁:原子操作+忙等待。

死锁风险

互斥锁:虽然也存在死锁风险,但相对较低,因为线程会睡眠,其他线程有机会获取锁。

自旋锁:更容易出现死锁,因为不会释放CPU资源,如果持有锁的线程进入死循环,其他线程将无法获取锁。

使用环境

互斥锁:适用于用户态程序,可处理长时间持有锁的情况。

自旋锁:常用于内核态,因为内核中线程不能轻易阻塞。此外,在中断处理程序中也只能使用自旋锁,用互斥锁的代码可能导致睡眠,中断中不能睡眠。

补充:

读写锁基于互斥锁,特点是读可以多线程读,写只能一个线程写,同时读和写是互斥的。

读写锁、互斥锁、自旋锁都是悲观锁。悲观锁就好比云文档不能多人同时编辑,想要多人同时编辑就要使用乐观锁。乐观锁就是先改共享资源,改完再判断有没有别人修改,如果发生冲突再说,一般用于冲突概率很低的场景,比如SVN和Git这种应用。

自旋锁的死锁风险:
  1. 进入临界区后不能调用可能引起系统休眠的函数
  2. 临界区的代码不能被中断函数重入调用

如果进入临界区后睡眠,会引起这样的问题,如下图

如果临界区的代码在执行的时候,中断重入调用,如下图

上面两种情况下,都出现一个问题,就是在临界区运行时,还没有来得及释放锁,当前进程被动释放了CPU的使用权,然后下次「可能是中断处理函数,可能是CPU调度的其他线程」再进来的时候,情况就会比较复杂,因为之前的程序一直没有释放,导致锁一直获取失败,失败后又一直在等待,而且永远等不到锁的释放,就会导致死锁了。

互斥锁死锁风险:
  1. A等待B,B等待C,C等待A
  2. 互斥锁依赖线程调度,在中断中使用互斥锁,如果加锁失败就会系统死锁,卡在中断里。所以FreeRTOS只提供了在中断条件下的二值信号量函数,比如xSemaphoreTakeFromISR,不支持阻塞时间。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 18:15:58

项目介绍 MATLAB实现基于EWT-SVM经验小波变换(EWT)结合支持向量机(SVM)进行故障诊断分类预测(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是

MATLAB实现基于EWT-SVM经验小波变换(EWT)结合支持向量机(SVM)进行故障诊断分类预测的详细项目实例 请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面(含…

作者头像 李华
网站建设 2026/4/18 18:14:21

从图像放大到数据补全:手把手教你用MATLAB interp2搞定二维插值难题

从图像放大到数据补全:手把手教你用MATLAB interp2搞定二维插值难题 在科研和工程领域,我们常常会遇到这样的困境:手头的数据点稀疏得像沙漠中的绿洲,而我们需要描绘的却是整片绿洲的全貌。无论是卫星传回的低分辨率图像、地质勘探…

作者头像 李华
网站建设 2026/4/18 17:55:48

从架构到实现:基于FPGA与AD7768-4的高精度同步数据采集系统设计

1. 高精度数据采集系统的核心需求 在工业振动监测和动平衡分析这类场景中,数据采集系统面临着严苛的技术要求。想象一下,当我们需要监测大型旋转机械的运行状态时,系统必须能够捕捉到微米级的振动变化,同时还要保证多个通道之间的…

作者头像 李华
网站建设 2026/4/18 18:18:27

索尼相机终极解锁指南:OpenMemories-Tweak完全使用教程

索尼相机终极解锁指南:OpenMemories-Tweak完全使用教程 【免费下载链接】OpenMemories-Tweak Unlock your Sony cameras settings 项目地址: https://gitcode.com/gh_mirrors/op/OpenMemories-Tweak OpenMemories-Tweak是一款专为索尼相机用户设计的强大功能…

作者头像 李华
网站建设 2026/4/16 15:47:16

Whisper-WebUI语音转文字终极指南:如何免费快速生成专业字幕

Whisper-WebUI语音转文字终极指南:如何免费快速生成专业字幕 【免费下载链接】Whisper-WebUI A Web UI for easy subtitle using whisper model. 项目地址: https://gitcode.com/gh_mirrors/wh/Whisper-WebUI Whisper-WebUI是一款基于OpenAI Whisper模型的语…

作者头像 李华