当前位置: 首页 > news >正文

11.并发:自旋锁

原子操作和自旋锁的区别

相同点都是保护共享资源。

不同点在于:

原子操作简单易用,但只能做计数操作,保护的东西太少。

自旋锁主要用于多核处理器。短时期的轻量级加锁,加锁失败时原地打转、忙等待。避免了上下文调度和系统开销较小。

自旋锁

加锁步骤

查看锁的状态

如果锁是空闲的,将锁设置为当前线程持有

存在问题

在没有CAS函数前,多个线程同时执行这两个步骤会出错。

解决方案

CAS函数把这两个步骤合并为一条硬件级指令。第1步的比较锁状态和第2步的锁变量赋值,将变为不可分割的原子指令(硬件同步原语)

CAS函数

自旋锁使用CPU提供的CAS(Compare And Swap)函数,在用户态代码中完成加锁与解锁操作。

PAUSE指令

自旋锁并不一直忙等待,会与CPU紧密耦合,它通过CPU提供的PAUSE指令,减少循环等待时的耗电量;对于单核CPU,忙等待并没有意义,此时它会主动把线程休眠。

自旋锁原理

设自旋锁为变量lock,整数0表示锁是空闲状态,整数pid表示线程ID。

CAS(lock, 0, pid)表示自旋锁的加锁操作

CAS(lock, pid, 0)表示自旋锁的解锁操作

自旋锁伪代码

while (true)
{//因为判断lock变量的值比CAS操作更快,所以先判断lock再调用CAS效率更高if (lock == 0 && CAS(lock, 0, pid) == 1){return;}if (CPU_count > 1 ){ //如果是多核CPU,“忙等待”才有意义for(n = 1; n < 2048; n <<= 1){//pause的时间,应当越来越长for (i = 0; i < n; i++){pause();//CPU专为自旋锁设计了pause指令}if (lock == 0 && CAS(lock, 0, pid)){return;//pause后再尝试获取锁}}}sched_yield();//单核CPU,或者长时间不能获取到锁,应主动休眠,让出CPU
}

自旋锁相关API

定义自旋锁

spinlock_t s_lock ;

初始化自旋锁

int spin_lock_init(spinlock_t *lock);

获取自旋锁函数

//加锁
void spin_lock(spinlock_t *lock)

尝试获取自旋锁函数

尝试获取一次,获取成功返回“true”,获取失败返回“false”。程序继续往下执行
与上面的区别就是非阻塞

int spin_trylock(spinlock_t *lock)

释放自旋锁

void spin_unlock(spinlock_t *lock);

http://www.lryc.cn/news/143697.html

相关文章:

  • 使用EF Core更新与修改生产数据库
  • 法律小程序开发:让法律咨询更便捷
  • 【C++多线程】C++11互斥锁和条件变量实现生产者消费者模型
  • Webpack迁移Vite采坑指南
  • 设计模式-职责链模式
  • CMake学习笔记-VSCode使用Cmake编译C++工程
  • redis相关
  • 【VRTK4.0运动专题】轴移动AxisMove(真实身体的移动)
  • 【vue2-helper插件】提供Mixins和组件库相关的类型提示、智能补全、跳转等功能~
  • 论文解读 | ScanNet:室内场景的丰富注释3D重建
  • 手写数字识别之网络结构
  • 《动手深度学习》 线性回归从零开始实现实例
  • Redis 命令
  • Linux网络编程:线程池并发服务器 _UDP客户端和服务器_本地和网络套接字
  • nvm安装electron开发与编译环境
  • 玩转Mysql系列 - 第7篇:玩转select条件查询,避免采坑
  • 启动程序结束程序打开指定网页
  • 从零开始学习 Java:简单易懂的入门指南之包装类(十九)
  • leetcode分类刷题:哈希表(Hash Table)(一、数组交集问题)
  • UML四大关系
  • forms组件(钩子函数(局部钩子、全局钩子)、三种页面的渲染方式、数据校验的使用)、form组件的参数以及单选多选形式
  • 跨专业申请成功|金融公司经理赴美国密苏里大学访学交流
  • 第十一章 CUDA的NMS算子实战篇(下篇)
  • R语言01-数据类型
  • 【网络基础实战之路】基于三层架构实现一个企业内网搭建的实战详解
  • C++11相较于C++98多了哪些可调用对象?--《包装器》篇
  • 栈与队列:常见的线性数据结构
  • android framework之AMS的启动管理与职责
  • Decoupling Knowledge from Memorization: Retrieval-augmented Prompt Learning
  • 腾讯云coding平台平台inda目录遍历漏洞复现