你知道底层自旋锁是如何实现的吗

2023-05-16



我们在开发中,经常会用到自旋锁,对于使用接口来讲,仿照例子谁都会用,但是你知道其是如何实现自旋的吗?今天我们就来讨论一下其实现原理。

1、首先,我们需要实现一个结构体用于自旋锁的使用

     typedef struct spinlock{

                volatile unsigned int slock;

     }spinlock_t;

      接下来我们就要定义接口了;


2、接口实现

    (1)初始化接口

             #define  spin_lock_init(lock)   \

                 do{  \

                     ((spinlock_t *)lock)->slock = 0x0;   \      /*相当于赋初值*/

                }while(0)

      (2)上锁接口

               static  inline void spin_lock(spinlock_t *lock)

              {

                       raw_spin_lock(&lock->slock);

              }

         (3)释放锁

               static inline spin_unlock(spinlock_t *lock)

               {

                      raw_spin_unlock(&lock->slock);

               }


3、更底层汇编实现

       大家可以看到上边上锁和解锁都调用了另外两个函数,这两个函数才是自旋锁的精华所在,下边我们来具体讨论一下


        raw_spin_lock:

                  mov  r1,#1         @1-->r1

                  DSB

               take_again:

                  LDREX     r2,[r0]            @把r0的内容赋给r2,同时置全局标志exclusive

                  STREX     r3,r1,[r0]        @尝试将r1写入到锁里边,首先检查exclusive是否存在,如果存在则将r1-->r0,r3 = 0,并清除exclusive标志,否则1--->r3,结束

                  TEQ         r3,#0

                  BNE       take_again

                  TEQ        r2,#0

                  BNE       take_again

                  MOV       pc,lr                @返回


         raw_spin_unlock:

                DSB

                MOV r1,#0

                STR  r1,[r0,#0]                  @为0,标示锁已释放

                DSB

                MOV  pc,lr


         经过这两段代码,是不是对自旋锁的实现更加清晰明了了?


4、如果想在自旋锁的同时锁中断和开中断怎么办呢?只需要在获取锁和释放锁接口里加上类似于local_irq_save和local_irq_restore之类的中断控制函数即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你知道底层自旋锁是如何实现的吗 的相关文章

  • 使用 JWT 让你的 RESTful API 更安全

    传统的 cookie session 机制可以保证的接口安全 xff0c 在没有通过认证的情况下会跳转至登入界面或者调用失败 在如今 RESTful 化的 API 接口下 xff0c cookie session 已经不能很好发挥其余热保护
  • CAN报文解析—案例

    1 CAN报文定义 CAN报文是指发送单元向接受单元传送数据的帧 我们通常所说的CAN报文是指在CAN线 xff08 内部CAN 整车CAN 充电CAN xff09 上利用ECU和CAN卡接收到的十六进制报文 2 CAN协议中CAN报文种类
  • 单片机中,intrins.h头文件中各函数详解:空指令_nop_(),移位函数_crol_、_cror_

    intrins h 在 C51单片机编程中 xff0c 我们经常使用到 nop 延时一个机器周期 如果晶振是12M xff0c 则延时1 us xff0c 该空函数在头文件intrins h中 头文件 INTRINS H 中的函数使用很方便
  • Linux 下模拟Http 的get or post请求(curl和wget两种方法)

    一 get请求 xff1a 1 使用curl命令 xff1a curl 34 http www baidu com 34 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl i 34 http www baidu co
  • QT入门基础认知(三个常用类、三种对话框类型、信号和槽)

    1 简单介绍 xff1a 1 1 三个常用类 xff08 Qwidget类 QDialog类 QMainwindow类 xff09 Qwidget类 xff1a 继承与QObject类和QPaintdevice类 xff0c 所有用户界面对
  • socket函数的domain、type、protocol解析

    socket 函数的 domain type protocol 解析 lxg 64 2015 04 09 内核中的 socket 概览 图一 xff1a socket 概览 内核中套接字是一层一层进行抽象展示的 xff0c 把共性的东西抽取
  • code的用法

    今天写程序的时候用了const xff0c 想到之前遇到的code的用法 xff0c 那是第一次遇到code的那样的用法 xff0c 查了一下 xff0c 解释如下 xff1a 在单片机使用C语言进行编程的时候 xff0c 经常使用到cod
  • Linux的system()和popen()差异

    Linux的system 和popen 差异 1 system 和popen 简介 在linux中我们可以通过system 来执行一个shell命令 xff0c popen 也是执行shell命令并且通过管道和shell命令进行通信 sys
  • HTTP的303、307状态码

    之前在 http权威指南 中看到了HTTP的307状态码 xff0c 当时因为没有找到可以实验的网站所以没有比较深的印象 xff0c 今天在排查一个问题的时候恰巧遇到了HTTP 1 1 307 TemporaryRedirect xff0c
  • 如果获得页面跳转的最终URL

    最近做一个小功能 xff0c 就是获取一个页面经过跳转后的最终页面URL xff0c 这里的跳转方式包含但不仅限于HTTP 301 302 js meta refresh 下面是我想到的三种可能的解决方式 xff0c 可能会有更优的方法 x
  • pykafka的NoBrokersAvailableError原因

    今天在使用pykafka的时候遇到一个问题 xff0c 我的kafka和zookeeper运行在一台机器上面 xff0c 然后应用程序跑在另外一台机器上面 当我调用pykafka中的KafkaClient zookeeper host 61
  • pyspark的pickle.PicklingError

    今天在用pyspark的时候在一个类中调用rdd的map的时候报错 xff0c 代码如下 xff1a rdd 61 df filter size df emission gt span class hljs number 50 span r
  • 一行代码引发的"血案"

    昨天在使用pykafka的时候又遇到了之前我遇到过的PartitionOwnedError ConsumerStoppedException异常 xff0c 关于这个异常我之前写过一篇分析的文章 链接在这里 xff0c 我自认为之前应该是把
  • X-Pack的machine learning

    如何使用X Pack的machine learning 最近在使用X Pack中的机器学习功能 xff0c 主要的就是利用非监督的时间序列模型 xff0c 用来检测流量的变化 xff0c 关于X Pack这块的文章好像可以参考的比较少 xf
  • C++自己写的HTTP类

    发起HTTP请求 define NORMAL CONNECT INTERNET FLAG KEEP CONNECTION define SECURE CONNECT NORMAL CONNECT INTERNET FLAG SECURE d
  • 知识总结--checksum校验和算法

    在项目开发过程中 xff0c 经常会使用到checksum检验和 xff0c 但是在不同的协议对接过程中发现checksum算法还是有差异的 本文的目的是对常用的checksum算法进行总结 xff0c 并不断完善和补充 xff0c 以备后
  • 让你编码嗨到停不下来的8个VSCode插件

    经作者授权后翻译成中文 xff0c 原文链接 xff1a https levelup gitconnected com 7 vs code extensions that make you want to keep coding forev
  • 51单片机数组的定义方法(code与data的作用)

    数组前不加 code 或 data xff0c 则默认将数组存放在程序存储器中 xff1b code 指定数据是存储在代码区 xff0c 数据是在编程的时候跟代码一起写入代码存储器 xff0c 运行过程中不能改变 xff1b xdata 指
  • Python+Requests对图片验证码的处理

    Requests对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入 xff0c 而且每次登录时图片验证码都是随机的 xff1b 当通过request做接口登录的时候要对图片验证码进行识别出图片中的字段 xff0c 然后再登录接

随机推荐