自旋锁学习总结

Linux下自旋锁的学习使用 1、spin_lock和spin_lock_irq的区别是如果临界区发生中断,系统会暂停当前进程运行,转向处理中断,有人会问临界区会不会发生中断,如果调用spin_lock保护临界区的话,答案是一定会发生中断。自旋锁会自动禁止抢占,也就说当线程A得到锁以后会暂时禁止内核抢占,如果线程A在持有锁期间进入了休眠状态,那么线程A会自动放弃CPU使用权,线程B开始运行,线程B也想要获取锁,但是此时线程A持有,而且内核抢占还被禁止了,线程B无法被调度出去,那么线程A就无法运行,锁也就无法释放,好了死锁就发生了。 阅读详情
--为了获得一个自旋锁, 在某 CPU 上运行的代码需先执行一个原子操作,该操作测试并设置( test-and-set) 某个内存变量,由于它是原子操作,所以在该操作完成之前其他执行单元不可能访问这个内存变量。如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行;如果测试结果表明锁仍被占用,程序将在一个小的循环内重复这个“ 测试并设置” 操作,即进行所谓的“ 自旋”,通俗地说就是“在原地打转”。

使用范围:SMP或者单CPU但是内核可抢占


1.定义自旋锁
spinlock_t lock;

2.初始化自旋锁
spin_lock_init(lock)
该宏用于动态初始化自旋锁 lock。

3.获得自旋锁
spin_lock(lock)
该宏用于获得自旋锁 lock,如果能够立即获得锁,它就马上返回,否则,它将自旋在那里,
直到该自旋锁的保持者释放。
spin_trylock(lock)
该宏尝试获得自旋锁 lock,如果能立即获得锁,它获得锁并返回真,否则立即返回假,实际
上不再“在原地打转”。

4.释放自旋锁
spin_unlock(lock)


使用程序模版

/* 定义一个自旋锁
spinlock_t lock;
spin
_lock_init(&lock);
spin
_lock (&lock) ; /* 获取自旋锁,保护临界区 */
. . ./
* 临界区*/
spin
_unlock (&lock) ; /* 解锁*/

成套自旋锁机制

spin_lock_irq() = spin_lock() + local_irq_disable()
spin
_unlock_irq() = spin_unlock() + local_irq_enable()
spin
_lock_irqsave() = spin_lock() + local_irq_save()
spin
_unlock_irqrestore() = spin_unlock() + local_irq_restore()

spin_lock_bh() = spin_lock() + local_bh_disable()
spin
_unlock_bh() = spin_unlock() + local_bh_enable()
 


使用自旋锁实现设备只能被一个进程打开


int xxx
_count = 0;/*定义文件打开次数计数*/
2
3 static int xxx
_open(struct inode *inode, struct file *filp)
4 {
5 ...
6 spinlock(&xxx
_lock);
7 if (xxx count) { /
*已经打开*/
8 spin
9 return - EBUSY;
10 }
11 xxx
_count++;/*增加使用计数*/
12 spin
_unlock(&xxx_lock);
13 ...
14 return 0; /
* 成功 */
15 }
16
17 static int xxx
_release(struct inode *inode, struct file *filp)
18 {
19 ...
20 spinlock(&xxx
_lock);
21 xxx
_count--; /*减少使用计数*/
22 spin
_unlock(&xxx_lock);
23
24 return 0;
25 }




Boost库中的spinlock机制是一种非常高效的锁机制,它通过忙等待自旋的方式提高了多线程程序的运行效率 同时,我们还可以尝试使用其他的锁算法,如mutex和spin_mutex,来和spinlock进行对比,以便更好地了解它们之间的差异。总之,boost::detail::spinlock是一种非常高效、稳定的锁机制,在多线程编程中得到了广泛的应用。通过编写测试程序,我们可以更好地理解spinlock的实现原理,掌握spinlock的使用方法,并且为我们在实际项目中选择合适的锁机制提供参考。Boost库中的spinlock机制是一种非常高效的锁机制,它通过忙等待自旋的方式提高了多线程程序的运行效率。 阅读详情

相关推荐

使用C++编写的boost::detail::spinlock测试程序

在本文中,我们编写了一个使用boost::detail::spinlock的测试程序,展示了如何正确地使用自旋锁来实现对共享资源的互斥访问。Boost库提供了一个名为boost::detail::spinlock的自旋锁(spinlock)实现,它是一种基于自旋的互斥量,适用于一些低延迟的场景。本文将介绍如何编写一个使用boost::detail::spinlock的测试程序。在上面的函数中,我们使用boost::detail::spinlock::scoped_lock来获取自旋锁。

YOLO_CODE的博客 222

嵌入式 自旋锁、互斥锁、读写锁、递归锁

互斥锁(mutexlock): 最常使用于线程同步的锁;标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁;临界区和互斥量都可用来实现此锁,通常情况下锁操作失败会将该线程睡眠等待锁释放时被唤醒 自旋锁(spinlock): 同样用来标记只能有一个线程访问该对象,在同一线程多次加锁操作会造成死锁;使用硬件提供的swap指令或test_and_set指令实现;同互斥...

weixin_33919941的博客 316

C++编程:使用boost::detail::spinlock_pool进行自旋锁池的测试

我们可以方便地管理多个自旋锁,并实现对共享资源的高效访问。在实际应用中,您可能需要更复杂的并发控制策略,但这个简单的示例可以帮助您理解如何使用。方法,我们尝试获取自旋锁的所有权。如果自旋锁当前没有被其他线程占用,我们将获得自旋锁,并执行一些对共享资源的访问操作。如果自旋锁已被其他线程锁定,我们将看到一条相应的消息表明自旋锁已被锁定。自旋锁是一种用于保护共享资源的同步机制,它允许线程在等待共享资源时保持自旋,而不是进入睡眠状态。的自旋锁池,它可以用于管理多个自旋锁,提供更高效的并发访问。

DevProZ的博客 238

自定义自旋锁测试,理解自旋锁

自旋锁就是在对资源进行获取时,资源已经被占用,无法立即获取,所以一直自旋,循环尝试获取锁,等到其它线程将锁释放,才会获得锁。 代码写一个自旋锁 public class Zixuansuo { AtomicReference<Thread> atomicReference = new AtomicReference(); //加锁 public void dolock(){ Thread thread = Thread.currentThread();

weixin_45931215的博客 324

利用C++11原子量如何实现自旋锁详解

当自旋锁尝试获取锁时以忙等待(busy waiting)的形式不断地循环检查锁是否可用,下面这篇文章主要给大家介绍了关于利用C++11原子量如何实现自旋锁的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

python cartopy绘制扇形区域图/cartopy绘制北极部分区域

实际上,这个问题原因还是由于投影转换的问题,在set_extend时,绘制的上下边界仍然是方形、未被正确投影的边界,与我们的set_boundary存在冲突,最根本的原因还是在于cartopy对于投影计算的一些缺陷。另外我们需要指出的是:**该方法不适用于极地投影,即NorthPolarStereo,由于NorthPolarStereo本身投影特性只需一个参数,本身并不适合。我们绘制极地投影时,同样也是使用set_boundary绘制圆形边界,那么当我们想要绘制扇形时,可以通过。请根据喜好自行选择,

weixin_43750300的博客 3212

嵌入式学习之Linux驱动 自旋锁

int major;int minor;int flag;//初始化自旋锁//因为 flag 是一个全局共享变量,如果多个进程/CPU 并发打开设备,可能造成竞态条件(race condition),出现多个进程都认为设备是空闲的,导致重复打开。// 使用自旋锁可以在 SMP(多核系统)中保证该段代码原子性和互斥性,防止并发访问冲突。if(flag!=1){ //利用 flag=1 表示“空闲”,flag=0 表示“正在使用”。flag=0;return 0;

TheAnswerisy的博客 232

计算机国际会议中的proceedings、conference、paper、workshop、demo:如何区分与选择?

本文详细解析了计算机国际会议中的核心概念:Conference(会议)是学术交流的主舞台,Paper(论文)是研究成果的书面呈现,被接收后收录于Proceedings(会议论文集)。Workshop(研讨会)聚焦前沿细分领域,Demo(演示)则侧重系统与工具的可交互展示。文章为研究者根据自身阶段与工作类型,如何区分与选择投稿目标提供了实用指南。

weixin_29269441的博客 563

windows自旋锁的实现学习

单cpu是无法使用自旋锁的,因为在等待自旋锁过程中,该线程是一直运行的,导致其他线程无法释放锁,就死锁了。一直无法理解这些同步是怎么实现的,问了deepseek,我知道自旋锁是如何实现了的,在这里做个笔记备用。如果*lock的值为1,则不断的执行L1代码。xchg指令是在交换eax和*lock的值时,会锁定*lock的总线,防止其他线程改变其值。该线程获取锁后,并且完成操作后,比如改变一个全局变量的值,会立即将IRQL退回到之前等级。该线程获取锁后,*lock从0变为1,其他尝试获取锁的线程会不断的自旋。

weixin_44029667的博客 336

三相逆变器拓扑结构的分析及应用场景

三相逆变器是电力电子领域中广泛应用的一种设备,用于将直流电转换为交流电。不同的拓扑结构在性能、成本、复杂度和应用领域上存在差异。小编将在本文中将进一步拓展对三相逆变器拓扑结构的分析,并探讨其适用的应用场景。

道合顺的博客 2237

ROS 入门教程:小乌龟仿真器和基础操作

小乌龟仿真器和ros基础操作

zlflll的博客 4127

自旋锁(spin lock)学习

目录 目的 用途 与互斥锁区别 相同点 不同点 原理 可能出现的问题 死锁(骑驴找驴) 过多占用cpu资源 使用场景 目的 为了防止多处理器并发,保护共享资源。 用途 在内核中大量用于中断处理。 对于单处理器,防止中断处理中的并发可以采用关闭中断的方式(标志寄存器中的中断标志位) 与互斥锁区别 相同点 为保护共享资源提出的锁机制:为了解决对某项资源的互斥使用。 在任何时刻,最多只能有一个执行单元获得锁。 一个执行单元要想访问被锁保护的共享资源,必须先得到锁,在

DayDayUp 3335

ASP.NET MVC5 C# Entity Framework 连接 Oracle 数据库

ASP.NET MVC5 C# Entity Framework 连接 Oracle 数据库创建数据库安装 Entity Framework配置数据库连接字符串添加实体模型类添加数据库上下文类添加控制器类运行测试 创建数据库 创建【全局数据库名】为 demodb 的Oracle数据库,用 SYSTEM 用户连接成功后创建【用户名】为 DJIANG 的用户,并授予该用户 DBA 角色 安装 Enti...

idjiang的博客 2538

Linux 自旋锁学习总结

前言 总结

wangjun7121的专栏 550

微型纵向加密在新能源场站中的实战部署与运维避坑指南

本文详细解析了微型纵向加密在新能源场站中的实战部署与运维技巧。通过国密算法SM4实现数据加密,确保新能源场站通信安全,同时提供非侵入式部署方案和运维避坑指南,帮助提升网络稳定性和运维效率。

weixin_30505225的博客 599

备战2025数学建模国赛(算法46):多目标优化

本篇博客将深入浅出地介绍多目标优化的核心概念、主流算法,并重点结合一个数学建模竞赛的经典案例,提供完整的Python代码实现,助你在未来的竞赛中游刃有余。它通过寻找帕累托最优解集,完美地诠释了“鱼与熊掌不可兼得”的权衡思想,为最终决策提供科学依据。这些问题都包含多个相互冲突的目标,传统的单目标优化方法(如梯度下降、单纯形法)对此无能为力,因为它们无法同时优化多个目标。在数学建模竞赛中,我们面临的绝大多数问题都不是单一的“最好”,而是充满权衡与妥协的“最优”。记住,成功的建模不仅在于解出问题,更在于清晰地。

YOLO 286

自旋锁学习

innodb 在实现锁时采用自旋锁: 自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁

回南山种豆的专栏 762

如何在 FPGA 中做数学运算

FPGA 非常适合进行数学运算,但是需要一点技巧,所以我们今天就看看如何在 FPGA 中进行简单和复杂的数学运算。介绍由于FPGA可以对算法进行并行化,所以FPGA 非常适合在可编程逻辑中实现数学运算。我们可以在 FPGA 中使用数学来实现信号处理、仪器仪表、图像处理和控制算法等一系列应用。这意味着 FPGA 可用于从自动驾驶汽车图像处理到雷达和飞机飞行控制系统的一系列应用。因为 FPGA 寄存器...

OpenFPGA的博客 2919

java学习之锁学习,自旋锁详细讲解

自旋锁的定义:当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。这种采用循环加锁 -> 等待的机制被称为自旋锁(spinlock)。此篇文章我们主要讲述了自旋锁的提出背景,自旋锁是为了提高资源的使用频率而出现的一种锁,自旋锁说的是线程获取锁的时候,如果锁被其他线程持有,则当前线程将循环等待,直到获取到锁。自旋锁在等待期间不会睡眠或者释放自己的线程。

白话机器学习 2042

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

嵌入式学习2-自旋锁

自旋锁是内核同步的基础,许多同步操作都依赖自旋锁。

原来我什么都不懂! 182

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++11,自旋锁学习

链接地址如下: 使用C++11原子量实现自旋锁 - 兔晓侠 - 博客园用C++11标准引入的原子量实现简易的自旋锁。https://www.cnblogs.com/FateTHarlaown/p/9170474.html记录一下

qqshuaishuai的博客 104

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

nginx学习之自旋锁nginx_spinlock

nginx中自旋锁简介: 基于原子操作,Nginx实现了一个自旋锁。自旋锁是一种非睡眠锁,也就是说,某进程如果试图获得自旋锁,当发现锁已经被其他进程获得时,那么不会使得当前进程进入睡眠状态,而是始终保持进程在可执行状态,每当内核调度到这个进程执行时就持续检查是否可以获取到锁。在拿不到锁时,这个进程的代码将会一直在自旋锁代码处执行(下面的源码会分析到),知道其他进程释放了锁且当前进程获取到了锁

Shangri-La 1140

Linux内核学习——3. 自旋锁的实现

自旋锁的实现 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统 开发环境:Linux 3.4.2内核、arm-linux-gcc 4.3.2工具链 目录 自旋锁的实现3、自旋锁spinlock的实现3.1 spinlock的通俗理解3.2 spinlock的数据结构spinlock_t3.2.1 分析3.2.2 总结3.3 spinlock在UP系统的实现3.3.1 spin_lock():要明确知道该锁不会在中断处理程序中使用3..

weixin_42813232的博客 1370

自旋锁&CLH锁&MCS锁学习记录

lock 阅读原文请访问我的博客BrightLoong's Blog 本篇文章主要记录自旋锁、CLH锁、MCS锁的学习所得。关于自旋锁和CLH锁、MCS锁,网上已经有很多内容,而且很类似;学习就是学习前人经验,理解、总结,化为己用,因此,虽然网上有很多相关的内容,我也是参考了这些内容,我依然选择记录下了自己的理解,方便自己查阅。 一. 自旋锁 ...

brightloong的博客 531

nginx 自旋锁学习

用途 spin_lock的使用场景是你预知很快能获得资源,快速把cpu用起来。 nginx源码: void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin) { #if (NGX_HAVE_ATOMIC_OPS) ngx_uint_t i, n; for ( ;; ) { if (*lock == 0 && ngx_atomic_cmp_set(lock

meetyanfei的博客 444

Linux学习自旋锁,信号量

自旋锁实际上是一种忙等,对于自旋锁有两点需要注意一下: 1、当锁不可用时,CPU一直循环执行“测试并设置”(测试并设置:是原子性操作)该锁直到可用而取得该锁,CPU在自旋等待时不做任何有用的工作,只是进行等待。因此只有在占用锁的时间极短的情况下,使用自旋锁才是合理的。当临界区很大或有共享设备时,需要较长时间占用锁,使用自旋锁会降低系统的性能。 2、自旋锁可能导致系统死锁,引起这个问题常见的情况...

申小白 250
上一篇: linux的原子操作学习总结
下一篇: alsa-lib和alsa-util安装编译及开发板移植
BERLIN23
博客等级 码龄14年 7粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值