互斥锁和自旋锁的区别

【Linux 多线程】自旋锁与互斥锁区别 POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API。线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁机制(lock)来对多个线程之间的共享临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。 Pthreads提供了多种锁机制: Mutex(互斥量):pthread_mutex_t... 阅读详情

自旋锁(Spin lock)

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。其作用是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远 高于互斥锁。虽然它的效率比互斥锁高,但是它也有些不足之处:
    1、自旋锁一直占用CPU,他在未获得锁的情况下,一直运行--自旋,所以占用着CPU,如果不能在很短的时 间内获得锁,这无疑会使CPU效率降低。
    2、在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。

因此我们要慎重使用自旋锁,自旋锁只有在内核可抢占式或SMP的情况下才真正需要,在单CPU且不可抢占式的内核下,自旋锁的操作为空操作。自旋锁适用于锁使用者保持锁时间比较短的情况下。

两种锁的加锁原理

互斥锁:线程会从sleep(加锁)——>running(解锁),过程中有上下文的切换,cpu的抢占,信号的发送等开销。

自旋锁:线程一直是running(加锁——>解锁),死循环检测锁的标志位,机制不复杂。


互斥锁属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞 (blocking),Core0 会在此时进行上下文切换(Context Switch)将线程A置于等待队列中,此时Core0就可以运行其他的任务(例如另一个线程C)而不必进行忙等待。而自旋锁则不然,它属于busy-waiting类型的锁,如果线程A是使用pthread_spin_lock操作去请求锁,那么线程A就会一直在 Core0上进行忙等待并不停的进行锁请求,直到得到这个锁为止。

两种锁的区别

互斥锁的起始原始开销要高于自旋锁,但是基本是一劳永逸,临界区持锁时间的大小并不会对互斥锁的开销造成影响,而自旋锁是死循环检测,加锁全程消耗cpu,起始开销虽然低于互斥锁,但是随着持锁时间,加锁的开销是线性增长。

两种锁的应用

互斥锁用于临界区持锁时间比较长的操作,比如下面这些情况都可以考虑

1 临界区有IO操作

2 临界区代码复杂或者循环量大

3 临界区竞争非常激烈

4 单核处理器

至于自旋锁就主要用在临界区持锁时间非常短且CPU资源不紧张的情况下,自旋锁一般用于多核的服务器。


【基础知识】互斥锁、读写锁、自旋锁的区别 默认选择互斥锁:在大部分应用层代码中,临界区代码执行时间不确定或不是很短,优先使用互斥锁。它的行为最稳妥。 考虑自旋锁:如果你能确定临界区的代码执行时间非常短(例如,只是几条原子指令,修改一个指针或计数器),并且在多核CPU上,可以考虑使用自旋锁来榨取极致性能。 考虑读写锁:当你的数据结构存在明显的读多写少(例如90%的读,10%的写)的访问模式,并且读操作耗时较长时,使用读写锁可以带来巨大的性能提升 阅读详情

相关推荐

Unity URP半透明物体深度排序优化:解决自交叠渲染瑕疵

本文深入探讨了Unity URP管线中半透明物体深度排序的优化方法,重点解决自交叠区域的渲染瑕疵问题。通过双通道渲染、深度预写入、多通道渲染等核心技术,结合实战案例和性能数据,帮助开发者实现高质量的透明效果渲染。

weixin_30879169的博客 418

spinlock和mutex的区别

spinlock和mutex两个都是互斥锁,不同的地方是spinlock是忙等待,不支持睡眠 mutex是可以睡眠,把当前等待mutex的task置于睡眠等待队列中,等mutex被释放之后再调度。 ...

天使之翼 7884

halcon 检测直线

图中后三个对象既是检测出的图像;

qq_59062726的博客 665

自旋锁互斥锁使用注意区别

自旋锁:互斥锁:1.自旋锁不会睡眠,互斥锁会有睡眠,因此自旋锁效率高于互斥锁。2.由于一直查询,所以自旋锁一直占用cpu,互斥锁不会,自旋锁导致cpu使用效率低3.自旋锁容易造成死锁 互斥锁和自旋锁的区别https://blog.youkuaiyun.com/susidian/article/details/510688581、自旋锁一直占用CPU,他在未获得锁的情况下,一直运行--自旋,所以占用着CPU,...

bewinged 2910

AS5600磁编码器IIC通信与角度读取实战指南

本文提供了AS5600磁编码器通过IIC通信协议实现高精度角度读取的完整实战指南。详细解析了硬件连接要点、IIC通信时序、Arduino与STM32平台驱动代码,并分享了多圈测量、噪声滤波等进阶应用与避坑技巧,帮助开发者快速将这款非接触式角度传感器集成到电机控制、旋钮等项目中。

weixin_29172201的博客 242

LED灯闪烁实验:实验介绍

每个章节都会单独进行验证工作,例如Simulink开发的应用层软件,会在Simulink-TestHarness中进行仿真,通过Scope示波器模块输出0-1交替的结果。CubeIDE集成双方的代码后,会烧写到开发板中验证是否按照定义的时间进行闪烁。ST-LINK V2是STM32开发生态系统中常用的硬件调试接口,能够连接微控制器与开发环境,实现程序的下载、调试和分析。STM32F103C8T6最小系统板是基于STM32F103C8T6微控制器的开发板,本实验会涉及使用板载的连接PC13引脚的LED灯。

u013288925的博客 456

C++ 的并发学习:CAS,SPIN和MUTEX

众所周知,多线程环境下如果不使用“锁”来对非原子数据进行操作的话,将会导致数据错误,轻则数值错误,重则公司破产(秒杀系统超卖) 在C++中,有两种锁,一种是MUTEX,互斥锁,即当某个线程调用锁时,其他线程将会阻塞等待那个线程释放锁,是最简单的并发控制,另一种则是用atomic类型变量实现的cas自旋锁,只需要耗费一点CPU时间即可完成快速的加锁解锁,具体的性能差距我们看看代码和数据就知道了。 ...

小罗的学习博客 1990

跨越边界:用MessagePipe实现无缝的进程间通信

MessagePipe是一个用于.NET平台的消息传递库,它专注于简化异步消息处理和进程间通信。通过提供一系列易于使用的API,开发者可以快速搭建起稳定可靠的通信管道,支持多种传输协议(如TCP、Unix域套接字等),并内置了序列化/反序列化功能,使得跨语言和跨平台的数据交换变得轻而易举。为了方便序列化和反序列化操作,我们需要为每种消息定义对应的类或结构体,并标记属性。这样可以确保消息在发送方和接收方之间正确无误地传递。[Key0set;[Key1set;

墨夶的博客 816

双缓冲安全队列(DoubleCacheQueue)与自旋锁(SpinMutex)

原文转自:http://www.tanjp.com/archives/144(即时修正和更新) 双缓冲安全队列(DoubleCacheQueue) 双缓冲区,故名思义就是要有两个缓冲区(简称A和B)。这两缓冲区,总是一个用于生产者,另一个用于消费者。当缓冲区触发某个条件时,进行一次切换(先前被生产者写入的转为消费者取出,先前消费者取出的转为生产者写入)。而这个触发的条件,一般是以快速消...

谈极品技术 - tanjp.com 1386

OpenCV实战(1)——OpenCV与图像处理基础

OpenCV 是一个跨平台计算机视觉和机器学习库,实现了图像处理和计算机视觉方面的很多通用算法。本节将介绍 OpenCV 的基础知识,以及如何编译运行 OpenCV 程序,并介绍如何完成最基本的图像处理任务——读取、显示和保存图像。除此之外,鼠标事件和图形绘制也是 OpenCV 计算机视觉项目中常用的基本功能,本节介绍了如何使用这两个重要的 OpenCV 功能。

盼小辉丶的博客 12万+

11.Labview实现用户界面切换的几种方式---通过VI间相互调用

本文介绍了界面切换的几种方式,分别是重入和引用①重入方式可以通过调用子VI的方式打开被调用的界面,往往应用于弹窗等的设置程序。②引用方式分两种,一种是打开引用,一种是静态引用。区别在于打开引用需要设置被打开VI的目标地址,静态引用仅需在引用时绑定VI的位置即可。③推荐使用静态引用的方式切换界面。④使用引用打开界面时,需通过属性节点和调用节点来设置程序的状态。更多内容欢迎大家补充和留言讨论~本文介绍了GUI界面设计相关的程序,更多相关文章后续持续更新,请关注作者不迷路~本期就到这里,再见~

关注我,更多技术问题欢迎私聊~ 9542

pthread互斥锁与sleep的用法

#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <pthread.h> pthread_mutex_t g_mutex; int g_lock_var = 0; void* thread1( void arg ) { int i, ret; time_t end_time; end_time = time(NULL) + 1

lorraineof的博客 2583

如何借助Gemini 3 Pro完成一篇文献精读?(劝收藏)

金句必须是原文的完整句子,并附上该句子在文中的大致位置。你是一名资深科研文献评估专家,请根据我提供的文献信息(标题、作者、期刊、时间、引用、摘要、结论、图表)依次输出:①影响力评估:按期刊、作者、时间、引用、问题重要性给出1–10分及简述;用上述方法再结合Gemini 3 Pro的辅助,原本需要3小时才能读完一篇文献,现在只需50分钟,不管是顶刊论文还是领域内冷门论文,都可以用这套方法,另外七哥设计的高阶精读提示词,需根据自己的文献内容做调整,希望这篇文章的方法能帮你高效精读文献,掌握文献的精华内容。

智能AI让学术科研更容易 1300

自旋锁和互斥锁的区别

单CPU非抢占内核下:自旋锁会在编译时被忽略(因为单CPU且非抢占模式情况下,不可能发生进程切换,时钟只有一个进程处于临界区(自旋锁实际没什么用了)单CPU抢占内核下:自选锁仅仅当作一个设置抢占的开关(因为单CPU不可能有并发访问临界区的情况,禁止抢占就可以保证临街区唯一被拥有)多CPU下:此时才能完全发挥自旋锁的作用,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。

lx123010的专栏 1070

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

自旋锁和互斥锁实例_自旋锁和互斥锁的实现以及使用区别

一、自旋锁和互斥锁的实现基于硬件原语的一些抽象(比如:中断禁用、原子操作指令),怎么实现?可以参考清华大学操作公开课(向勇、陈渝老师讲的),以下摘抄一部分实现代码来实现抽象。Test And Setbool Test_And_Set(bool*flag){bool rv = *flag;*flag =TRUE;returnrv;}这是一条机器指令,这条机器指令完成了通常操作的读写两条机器指令的工作...

weixin_39640909的博客 822

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux自旋锁与互斥锁的区别与选用原则

一、区别 1.实现方式上的区别:互斥锁是基于自旋锁实现的,所以自旋锁相较于互斥锁更加底层。 2.开销上的区别:获取不到互斥锁时会发生上下文切换并休眠,而自旋锁则“自旋”在原地直到被获取。 3.使用场景的区别:互斥锁只能在进(线)程中使用,不能在中断里使用,而自旋锁可以在中断里使用。 4.使用方式上区别:互斥锁只能由获取到该锁的进(线)程来释放,而自旋锁没有这个限制,上锁和解锁一般是成对使用的。 二、选用原则 根据上述区别可得出以下三条选用原则: 1.当需要保护的临界区较小时,宜选用自旋锁,否则

Dokin 4752

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

自旋锁和互斥锁的区别?

自旋锁(Spinlock)和互斥锁(Mutex)是两种完全不同的锁机制,主要区别体现在。总结:中断上下文只能用自旋锁,可能睡眠的代码必须用互斥锁!

weixin_45837496的博客 753

自旋锁和互斥锁区别

自旋锁和互斥锁区别 2012-10-24 08:5515643人阅读评论(0)收藏举报 分类: linux(97) http://blog.youkuaiyun.com/kyokowl/article/details/6294341 POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API。线程同步(Th...

diaobaoxi6521的博客 356

Linux内核中的互斥锁和自旋锁的区别

很多人搞不清自旋锁和互斥锁的区别,这两种锁都是最底层的锁实现。是很多高级锁的基础。 为什么需要锁? 共享资源是有限的,且同一时间只能有一方占用。就像我们常见的共享单车,它是多人共用的,但是在某个时刻,只能有一个人使用,当我们扫码的时候,它只属于我们,其他人不能占用。这就是加锁的意义。为了保证系统中的共享资源在一个时刻只能有一个线程访问,避免多线程同时使用导致的数据错乱。 锁是谁加的? 任何操作都是由内核完成,线程向内核申请加锁,是否能锁住是由内核决定的。 互斥锁 假设我们目前有两个进程,进程A和进程B。当A

qq_41561171的博客 3136

自旋锁与互斥锁区别

自旋锁(Spinlock):当线程尝试获取一个已被占用的自旋锁时,它不会立即放弃CPU,而是原地循环(自旋),不断检查锁的状态,直到锁变为可用。因此,自旋锁在获取锁的开销较小,尤其是在锁很快就能被释放的场景下。互斥锁(Mutex):当一个线程试图锁定一个已经被其他线程持有的互斥锁时,该线程会被操作系统挂起(进入睡眠状态),并从运行队列移除,直到锁被释放,操作系统才会唤醒该线程,将其放回运行队列。互斥锁虽然在获取锁失败时会引入较高的上下文切换开销,但在锁等待时间较长时,可以让出CPU资源,避免资源浪费。

arvin_xiong的博客 708

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

上面两种情况下,都出现一个问题,就是在临界区运行时,还没有来得及释放锁,当前进程被动释放了CPU的使用权,然后下次「可能是中断处理函数,可能是CPU调度的其他线程」再进来的时候,情况就会比较复杂,因为之前的程序一直没有释放,导致锁一直获取失败,失败后又一直在等待,而且永远等不到锁的释放,就会导致死锁了。自旋锁:更容易出现死锁,因为不会释放CPU资源,如果持有锁的线程进入死循环,其他线程将无法获取锁。读写锁基于互斥锁,特点是读可以多线程读,写只能一个线程写,同时读和写是互斥的。自旋锁:原子操作+忙等待。

qq1714040125的博客 433

互斥锁和自旋锁区别

自旋锁和互斥锁的区别 注意点: 1 互斥锁会在等待期间放弃cpu(因为在尝试获得 $ 的时候就 禁止抢占) 2 自旋锁 对比 互斥锁少了线程的调度,也是节省了成本。 spin_lock 在单cpu 上 禁止抢占 preempt_disable spin_lock_irq 在单cpu 上 关本地中断 local_irq_disable 再 禁止抢占 preempt_disable ...

aningxiaoxixi的博客 854
上一篇: Android Vendor Test Suite (VTS) 的概念、作用及测试方法
下一篇: Linux Kernel数据结构:链表
Winston_Jory
博客等级 码龄14年 467粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值