skynet - spinlock 简单的自旋锁

spinlock.h

代码位于: https://github.com/cloudwu/skynet/blob/master/skynet-src/spinlock.h

该文件内,根据不同环境提供了 3 种 api 实现:

  • pthread_mutex_t 系列函数
  • gcc 内置原子操作函数
  • std atomic 系列函数

看了下,效率最高的是 std atomic 系列函数的实现:

#include "atomic.h"#define atomic_test_and_set_(ptr) STD_ atomic_exchange_explicit(ptr, 1, STD_ memory_order_acquire)
#define atomic_clear_(ptr) STD_ atomic_store_explicit(ptr, 0, STD_ memory_order_release);
#define atomic_load_relaxed_(ptr) STD_ atomic_load_explicit(ptr, STD_ memory_order_relaxed)#if defined(__x86_64__)
#include <immintrin.h> // For _mm_pause
#define atomic_pause_() _mm_pause()
#else
#define atomic_pause_() ((void)0)
#endifstruct spinlock {STD_ atomic_int lock;
};static inline void
spinlock_init(struct spinlock *lock) {STD_ atomic_init(&lock->lock, 0);
}static inline void
spinlock_lock(struct spinlock *lock) {for (;;) {if (!atomic_test_and_set_(&lock->lock))return;while (atomic_load_relaxed_(&lock->lock))atomic_pause_();}
}static inline int
spinlock_trylock(struct spinlock *lock) {return !atomic_load_relaxed_(&lock->lock) &&!atomic_test_and_set_(&lock->lock);
}static inline void
spinlock_unlock(struct spinlock *lock) {atomic_clear_(&lock->lock);
}static inline void
spinlock_destroy(struct spinlock *lock) {(void) lock;
}
  • spinlock_init 初始化 lock 默认值为 0
  • spinlock_lock 抢占设置 1 ,失败 while 自旋;自旋出来,再去抢占(for)
  • spinlock_trylock 查看 lock 并尝试抢占设置 1
  • spinlock_unlock lock 设回 0
  • spinlock_destroy 占位,没有可实际释放的资源

memory_order_x

memory_order_acquire/memory_order_release 比较好理解,请自行度娘

atomic_load_relaxed_ 函数内用的是 memory_order_relaxed 。 memory_order_relaxed 即普通内存访问

因此 atomic_load_relaxed_ 性能效果等价于普通内存访问(即性能最高),且可能会返回错值

妙的地方在于:

  • spinlock_lock for - while 双重循环,允许 atomic_load_relaxed_ 可能的误判
  • spinlock_trylock 函数语义本身就在于 TRY 。因此也允许可能的误判

_mm_pause

while 空循环的一种性能优化,度娘了解知道就好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试-信息收集

网络安全信息收集是网络安全领域中至关重要的一环&#xff0c;它涉及到对目标系统、网络或应用进行全面而细致的信息搜集和分析。这一过程不仅有助于理解目标网络的结构、配置和潜在的安全风险&#xff0c;还能为后续的渗透测试、风险评估和安全加固提供有力的支持。 在网络安…

安卓开发--新建工程,新建虚拟手机,按键事件响应(含:Android中使用switch-case遇到case R.id.xxx报错)

安卓开发--新建工程&#xff0c;新建虚拟手机&#xff0c;按键事件响应 1.前言2.运行一个工程2.1布局一个Button2.2 button一般点击事件2.2 button属性点击事件2.2 button推荐点击事件&#xff08;含&#xff1a;Android中使用switch-case遇到case R.id.xxx报错&#xff09; 本…

MATLAB 多项式

MATLAB 多项式 MATLAB将多项式表示为行向量&#xff0c;其中包含按幂次降序排列的系数。例如&#xff0c;方程P(x) X 4 7 3 - 5 9可以表示为 p [1 7 0 -5 9]; 求值多项式 polyval函数用于求一个特定值的多项式。例如&#xff0c;在 x 4 时&#xff0c;计算我们之前的多项式…

HTTP URL 详解

概述 URL 提供了一种定位因特网上任意资源的手段&#xff0c;大多数 URL 语法都由以下九个结构的通用格式组成&#xff1a; <scheme>://<user>:<password><host>:<port>/<path>;<params>?<query>#<frag> 方案&#…

命令重装Linux系统,无需登录控制面板

命令重装Linux系统&#xff0c;无需登录控制面板 部分无法登录控制面板使用这个脚本 自动安装安装脚本 wget https://lyvba.com/auto.sh bash auto.sh -d 12 -v 64 -a -p $passwd \--mirror https://mirrors.ustc.edu.cn/debian/安装命令参考 # 自动安装 Debian 10 buster …

基于YOLOV8复杂场景下船舶目标检测系统

1. 背景 海洋作为地球上70%的表面积&#xff0c;承载着人类生活、经济发展和生态系统的重要功能。船舶作为海洋活动的主要载体之一&#xff0c;在海上运输、资源开发、环境监测等方面发挥着重要作用。复杂海洋环境下的船舶目标检测成为了海事管理、海洋资源开发和环境保护等领…

人工智能轨道交通行业周刊-第79期(2024.4.22-5.12)

本期关键词&#xff1a;无人机巡检、车机联控、减速顶、Agent、GraphRAG、RAGFlow 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…

2024OD机试卷-API集群负载统计 (java\python\c++)

题目:API集群负载统计 题目描述 某个产品的RESTful API集合部署在 服务器 集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,根据热点信息在服务器节点之间做负载 均衡,现在需要实现热点信息统计查询功能。 RESTful API是由多个层级构成,层…

《动手学深度学习》V2(11-18)

文章目录 十一、二 模型选择与过拟合和欠拟合1、模型的选择2、过拟合和欠拟合3、估计模型容量4、线性分类器的VC维5、过拟合欠拟合的代码实现 :fire:①生成数据集②定义评估损失③定义训练函数④三阶多项式函数拟合⑤线性函数拟合(欠拟合)⑤高阶多项式函数拟合(过拟合) 十三、权…

【C语言】精品练习题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目九&#xff1a; 题目十&#xff1a; 题目十一&#xff1a; 题目十二&#xff1a; 题目十…

「 网络安全常用术语解读 」漏洞利用预测评分系统EPSS详解

1. 概览 EPSS&#xff08;Exploit Prediction Scoring System&#xff0c;漏洞利用预测评分系统&#xff09; 提供了一种全新的高效、数据驱动的漏洞管理功能。EPSS是一项数据驱动的工作&#xff0c;使用来自 CVE 的当前威胁信息和现实世界的漏洞数据。 EPSS 模型产生 0 到 1&…

vue 中的 Vuex

Vuex Vuex是什么&#xff1f; 概念&#xff1a;专门在vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理(读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间…

2024最新小红书电商落地实操课,从入门到精通,打造爆款方法(16节课)

你是不是经常在小红书上看到各种各样的推广和引流方法&#xff0c;却感觉实际操作起来很困难&#xff1f; 那么&#xff0c;这门2024最新小红书电商落地实操课就是为你量身定制的&#xff01;从入门到精通&#xff0c;不仅能让你了解电商平台的基本规则和玩法&#xff0c;还能…

ansible------inventory 主机清单

目录 inventory 中的变量 2&#xff09;组变量[webservers:vars] #表示为 webservers 组内所有主机定义变量&#xff0c;所有组内成 员都有效 ansible_userrootansible_passwordabc1234 3&#xff09; [all:vars…

VulkanSDK Demos vkcube 编译失败

操作系统: Windows 11 23H2 Vulkan 版本: 1.3.2.280.0 Visual Studio 版本: 2022 在VulkanSDK/Demos目录下存在一个demo solution,其中包含两个project, vkcube和vkcubepp,两个分别为C语言和C写的示例程序, 但是直接编译这两个project时会编译失败,报了以下错误: fatal err…

[Java EE] 文件IO(一):文件概念与文件系统操作

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

LeetCode 每日一题 ---- 【2391.收集垃圾的最少总时间】

LeetCode 每日一题 ---- 【2391.收集垃圾的最少总时间】 2391.收集垃圾的最少总时间方法&#xff1a;模拟&#xff08;多次遍历&#xff09; 2391.收集垃圾的最少总时间 方法&#xff1a;模拟&#xff08;多次遍历&#xff09; 需要注意的点是&#xff0c;处理一个单位的一个…

mysql分页排序的坑,千万注意!

1、问题复现 现象&#xff1a; mysql对无索引字段进行排序后limit &#xff0c;当被排序字段有相同值时并且在limit范围内&#xff0c;取的值并不是正常排序后的值&#xff0c;有可能第一页查询的记录&#xff0c;重复出现在第二页的查询记录中&#xff0c;而且第二页的查询结…

青少年软件编程(Python)等级考试试卷(四级)2024年3月

电子学会2024.03青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;四级&#xff09; 一、单选题 1.运行如下代码&#xff0c;若输入整数3&#xff0c;则最终输出的结果为? ( ) def f(x): if x1: s1 else: sf(x-1)*x return s nint(input("请…

Java RMI SERVER命令执行漏洞

Java RMI SERVER命令执行漏洞 一、介绍二、原理三、复现准备四、漏洞复现 一、介绍 RMI全称是Remote Method Invocation&#xff08;远程方法调用&#xff09;&#xff0c;是专为Java环境设计的远程方法调用机制&#xff0c;远程服务器提供API&#xff0c;客户端根据API提供相…