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

C++中TAS和CAS实现自旋锁

目录1.TAS和CAS介绍2.TAS 使用场景极简自旋锁3.CAS 核心使用场景3.1.高性能自旋锁多核首选3.2.无锁线程安全计数器不用锁纯 CAS3.3.线程安全变量更新通用值替换4.测试代码5.TAS vs CAS对比1.TAS和CAS介绍它们是CPU 硬件提供的两种最基础的原子读 - 改 - 写RMW指令专门用来解决多线程并发竞争问题是所有锁、无锁结构的底层基石。TAS Test-And-Set 「测试并设置」读取内存里的旧值强制把这个内存写成 1true返回刚才读到的旧值核心特征一定会写不管原来是什么CAS Compare-And-Swap 「比较并交换」拿内存当前值 和 你给的期望值对比如果相等才把内存改成新值如果不等什么都不做返回是否修改成功核心特征条件写入不满足就不碰内存总结TAS先写为占用再告诉你之前是不是空闲CAS先看是不是空闲是才占用不是就放弃两者都是原子操作CPU 保证整个过程一步完成不会被其他线程打断。2.TAS 使用场景极简自旋锁TAS 是 CPU 原生的最简单原子指令只能实现基础互斥自旋锁优点是代码极简缺点是多核性能差。#include atomic #include thread #include iostream //intel指令 #include immintrin.h //_mm_pause(); // 和 pause 汇编完全一样 // 自旋等待优化x86 #define asm_volatile_pause() asm volatile (pause) // -------------------------- // TAS 实现极简自旋锁 // 场景临界区极短、低并发、追求代码最简单 // -------------------------- class TasSpinLock { private: // C 原生 TAS 原子变量硬件直接支持 std::atomic_flag lock_ ATOMIC_FLAG_INIT; public: void lock() { // TAS 核心test_and_set 原子读旧值 强制写true while (lock_.test_and_set(std::memory_order_acquire)) { asm_volatile_pause(); // 自旋优化 } } void unlock() { lock_.clear(std::memory_order_release); } }; // 测试多线程计数 int cnt 0; TasSpinLock tas_lock; void work() { for (int i 0; i 100000; i) { std::lock_guardTasSpinLock guard(tas_lock); cnt; } } int main() { std::thread t1(work), t2(work); t1.join(); t2.join(); std::cout TAS 自旋锁结果: cnt std::endl; // 200000 return 0; }✅ 适合简单互斥、低并发、代码极简❌ 不适合多核高竞争缓存颠簸严重3.CAS 核心使用场景CAS 是现代并发编程的基石支持条件写入自旋时不修改共享变量多核性能远超 TAS。3.1.高性能自旋锁多核首选// -------------------------- // CAS 实现高性能自旋锁 // 场景多核高并发、低延迟临界区 // -------------------------- class CasSpinLock { private: std::atomicbool locked_{false}; public: void lock() { bool expected false; // CAS 核心只有值expected(false)才写入true while (!locked_.compare_exchange_weak( expected, true, std::memory_order_acquire )) { expected false; // 重置期望值 asm_volatile_pause(); } } void unlock() { locked_.store(false, std::memory_order_release); } };3.2.无锁线程安全计数器不用锁纯 CASCAS 可以实现完全无锁的并发操作比自旋锁更快// -------------------------- // CAS 实现无锁原子计数器 // 场景高并发计数无锁、高性能 // -------------------------- std::atomicint cas_cnt{0}; void lock_free_count() { int old_val, new_val; for (int i 0; i 100000; i) { do { old_val cas_cnt; // 读旧值 new_val old_val 1;// 计算新值 // CAS只有旧值没被修改才更新成功 } while (!cas_cnt.compare_exchange_weak(old_val, new_val)); } } // 测试 int main() { std::thread t1(lock_free_count), t2(lock_free_count); t1.join(); t2.join(); std::cout CAS 无锁计数器: cas_cnt std::endl; // 200000 return 0; }3.3.线程安全变量更新通用值替换// -------------------------- // CAS 实现安全更新共享变量 // 场景任意线程安全值修改 // -------------------------- std::atomicint value{10}; void update_value(int target) { int old value; // 只有当前值old才更新为target if (value.compare_exchange_weak(old, target)) { std::cout 更新成功\n; } else { std::cout 值已被修改更新失败\n; } }4.测试代码// C RAII 自动锁通用 template typename Lock class ScopedLock { private: Lock lock_; public: explicit ScopedLock(Lock lock) : lock_(lock) { lock_.lock(); } ~ScopedLock() { lock_.unlock(); } // 禁用拷贝 ScopedLock(const ScopedLock) delete; ScopedLock operator(const ScopedLock) delete; }; // 测试代码 int counter 0; // 二选一测试TasSpinLock 或 CasSpinLock TasSpinLock spin_lock; // CasSpinLock spin_lock; // 线程工作函数 void work() { for (int i 0; i 100000; i) { ScopedLockdecltype(spin_lock) lock(spin_lock); // 自动加锁/解锁 counter; } } int main() { // 创建两个线程竞争锁 std::thread t1(work); std::thread t2(work); t1.join(); t2.join(); // 正确结果200000 std::cout 最终计数: counter std::endl; return 0; }5.TAS vs CAS对比特性TAS 自旋锁CAS 自旋锁原子操作atomic_exchange强制写atomic_cmpxchg条件写自旋行为每次循环都修改锁变量自旋时只读不修改缓存性能差多核缓存颠簸、总线流量大优缓存一致性友好性能场景单核 / 低竞争尚可多核高竞争拉胯多核 / 高竞争首选现代标准实现灵活性仅能做简单自旋锁可实现无锁队列、公平锁、futex 等

相关文章:

C++中TAS和CAS实现自旋锁

目录 1.TAS和CAS介绍 2.TAS 使用场景:极简自旋锁 3.CAS 核心使用场景 3.1.高性能自旋锁(多核首选) 3.2.无锁线程安全计数器(不用锁,纯 CAS) 3.3.线程安全变量更新(通用值替换)…...

浏览器指纹参数逻辑冲突的根因分析与工程化修复方案

引言2026 年,主流互联网平台的风控体系已完成从 “指纹唯一性校验” 到 “全参数逻辑一致性校验” 的全面升级,浏览器指纹的对抗焦点,也从早期的环境隔离、指纹防篡改,转向了指纹参数的内在逻辑自洽。当前行业内绝大多数指纹浏览器…...

深入解析Async++ Partitioner.h源码

Async Partitioner.h 源码分析 Async 是一个基于任务的并行编程库,其核心组件 partitioner.h 负责任务的划分与调度。以下是对该文件的详细分析,包含关键代码示例。 分区器核心设计 partitioner.h 定义了任务划分的策略,默认使用 auto_part…...

nhentai-cross跨平台漫画阅读器:打造全平台无缝阅读体验的终极指南

nhentai-cross跨平台漫画阅读器:打造全平台无缝阅读体验的终极指南 【免费下载链接】nhentai-cross A nhentai client 项目地址: https://gitcode.com/gh_mirrors/nh/nhentai-cross 还在为在不同设备间切换阅读漫画而烦恼吗?nhentai-cross跨平台…...

KMS_VL_ALL_AIO:Windows和Office智能激活完整指南

KMS_VL_ALL_AIO:Windows和Office智能激活完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统弹出激活提示而烦恼吗?Office突然变成只读模式让你束…...

机器学习指标解析:AUC与KS值

import numpy as np from sklearn.metrics import confusion_matrixy_pred [0, 1, 0, 1] # 模型预测结果 y_true [0, 1, 1, 0] # 真实标签 print(混淆矩阵:\n, confusion_matrix(y_true, y_pred))# 输出: # [[1 1] # [1 1]]## accuracy from sklearn.metrics i…...

ResNet50V2学习笔记

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、前期准备 import torch import torch.nn as nn import torch.optim as optim二、定义残差块 class ResidualBlockV2(nn.Module):expansion 4def __ini…...

【嵌入式IDE迁移避坑白皮书】:告别Keil/IAR!用VSCode实现同等专业级调试能力——含反汇编窗口同步、RTOS线程视图、硬件断点精准控制

更多请点击: https://intelliparadigm.com 第一章:嵌入式开发环境迁移的战略价值与技术全景 嵌入式开发环境迁移已从单纯工具链升级演进为系统性工程能力重构。随着芯片架构多元化(ARM Cortex-M/R/A、RISC-V、Xtensa)、RTOS生态分…...

仅限首批200家三甲医院技术科获取的VSCode医疗校验配置包(含NMPA审评要点映射表)

更多请点击: https://intelliparadigm.com 第一章:VSCode医疗校验配置包的权威性与临床合规价值 VSCode医疗校验配置包并非通用开发插件,而是由国家药品监督管理局(NMPA)认证医疗器械软件质量评估机构联合HL7 China工…...

N_m3u8DL-RE:跨平台流媒体下载工具的完整技术解析与实战指南

N_m3u8DL-RE:跨平台流媒体下载工具的完整技术解析与实战指南 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL…...

claude code高级使用手册

1. shift tab 切换模式,包括accept edits on、plan mode on和默认模式三种2. 在claude code中输入 ! 能够进入bash模式,可以输入终端命令执行,比如ls,如果要打开文件可以使用start 文件名,mac用户请使用open 文件名…...

Docker容器内VSCode Server启动失败?手把手复现并修复OCI runtime error(含strace日志溯源全过程)

更多请点击: https://intelliparadigm.com 第一章:Docker容器内VSCode Server启动失败?手把手复现并修复OCI runtime error(含strace日志溯源全过程) 当在 Alpine 或最小化镜像中运行 VSCode Server(如 co…...

C语言goto语句label标签用法详解,新手必看

在Visual Studio 2015发布之际,与之相关的学习资源呈现出不够充足的状况。本文会对在这个平台上学习C语言的系列教程经验做系统的介绍。鉴于视频制作以及修改所需要的周期比较长,当下先推出文字版的内容,这样方便能够及时地进行更新以及完善。…...

基于Simulink的拓展卡尔曼滤波:估计路面附着系数并使用EKF算法基于Matlab,包含道...

基于simulink的拓展卡尔曼滤波的估计路面附着系数估算,ekf算法基于matlab 内含道夫轮胎模型,七自由度车辆模型,非carsim联合仿真,运行结果如下各个输出收敛,效果不错直接上干货!这次咱们聊聊怎么用Simulink…...

VSCode编辑卡顿到想砸键盘?立即执行这7步诊断流程,95%问题3分钟闭环

更多请点击: https://intelliparadigm.com 第一章:VSCode编辑卡顿到想砸键盘?立即执行这7步诊断流程,95%问题3分钟闭环 VSCode 卡顿往往不是单一原因导致,而是扩展、配置、系统资源与工作区状态交织作用的结果。以下…...

【西里网】遇到的 Missing config 错误是因为 OpenClaw 找不到配置文件

你遇到的 **Missing config** 错误是因为 OpenClaw 找不到配置文件。你之前检查的 Docker 卷 openclaw-workspace 是空的,所以没有配置可用。## 解决方法### 1️⃣ 快速绕过(适合测试) 直接让 OpenClaw 运行在非受控模式: bash op…...

别再只用布尔了!3Dmax里给模型开圆孔的7种实用方法,从新手到高手都能用

别再只用布尔了!3Dmax里给模型开圆孔的7种实用方法,从新手到高手都能用 在3D建模的世界里,给模型开孔是最基础却也是最考验技巧的操作之一。很多初学者会习惯性地依赖布尔运算,但往往在复杂模型上遭遇破面、布线混乱等问题。实际上…...

基于YOLOv26深度学习算法的社区路灯故障检测系统研究与实现

文章目录 基于YOLOv26深度学习算法的社区路灯故障检测系统研究与实现 一、研究背景和意义 二、相关技术介绍 2.1 路灯管理现状 2.2 YOLOv26目标检测算法 2.3 路灯状态识别技术 三、基于YOLOv26的社区路灯故障检测算法研究实现方法 3.1 系统架构设计 3.2 数据集构建 3.3 路灯检测…...

vue2 和 vue3 的核心区别

vue2 和 vue3 的核心区别 Vue3 是 Vue2 的重构升级版本,基于全新的架构设计,在性能、开发体验、语法规范、工程化等方面都有质的提升,以下是两者最核心的区别: 一、核心架构与设计理念维度Vue2Vue3源码实现基于 Options API&#…...

Qianfan-OCR企业实操:合同文档表格Markdown识别+条款抽取落地案例

Qianfan-OCR企业实操:合同文档表格Markdown识别条款抽取落地案例 1. 项目背景与价值 在企业的日常运营中,合同文档处理是一项耗时且容易出错的工作。传统OCR技术通常只能实现简单的文字识别,对于复杂的合同文档结构(如表格、条款…...

如何永久保存微信聊天记录并生成个性化年度报告

如何永久保存微信聊天记录并生成个性化年度报告 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg 你是否曾…...

Jetson Xavier NX开机慢?试试调整UEFI这3个设置,启动速度立竿见影

Jetson Xavier NX开机优化实战:3个UEFI设置让启动速度提升200% 每次按下Jetson Xavier NX的电源键,看着屏幕上缓慢滚动的启动日志,你是否也经历过那种等待的煎熬?作为一款定位边缘计算的高性能模组,NX的启动速度与其强…...

从混淆矩阵到决策曲线:用Matplotlib一步步拆解DCA背后的净获益计算

从混淆矩阵到决策曲线:用Matplotlib拆解DCA的净获益计算 在医疗诊断和风险评估领域,我们常常需要判断一个预测模型是否真正具有临床价值。传统指标如准确率、AUC值虽然能反映模型性能,却无法回答一个关键问题:**使用这个模型做决策…...

Mixly编译ESP32程序头文件缺失:bits/c++config.h的根源分析与修复

1. 当Mixly遇上ESP32:头文件缺失的典型症状 第一次在Mixly里编译ESP32程序时看到bits/cconfig.h报错,我差点以为电脑中毒了。这个错误通常出现在你刚安装完Mixly,兴冲冲准备点亮第一个LED的时候。编译窗口突然弹出一堆红色错误,最…...

AI SoC全芯片DFT实战

01景芯DFT实战课景芯团队DFT专家老师授课,一对一辅导,主打文档服务器实战,通过3个系列课程依次完成HD6850各个关键子系统的DFT设计实战后,再完成下图全芯片TOP DFT实战,让您快速超越同龄人!我们不卖视频&am…...

3步轻松配置TTS-Vue桌面语音合成工具完整指南

3步轻松配置TTS-Vue桌面语音合成工具完整指南 【免费下载链接】tts-vue 🎤 微软语音合成工具,使用 Electron Vue ElementPlus Vite 构建。 项目地址: https://gitcode.com/gh_mirrors/tt/tts-vue TTS-Vue是一款基于微软语音合成技术构建的开源…...

Nucleus Co-Op技术解密:单机游戏分屏多人的创新突破与完整实现指南

Nucleus Co-Op技术解密:单机游戏分屏多人的创新突破与完整实现指南 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop Nucleus Co-Op是一款…...

LinkSwift:八大主流网盘直链下载解决方案的技术实践指南

LinkSwift:八大主流网盘直链下载解决方案的技术实践指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

从‘彩虹’到‘拖影’:给网络工程师讲明白光纤色散与高速网络故障排查

从‘彩虹’到‘拖影’:光纤色散对高速网络的实战影响与排查指南 凌晨三点,数据中心告警灯突然亮起——一条承载金融交易数据的400G链路误码率飙升到10^-5,而你的值班手机开始疯狂震动。这不是科幻场景,而是某跨国银行深圳分部的真…...

从实战复盘到技巧精讲:一次DASCTF解题的深度剖析与通用Writeup方法论

1. 赛题复盘与解题思路拆解 参加CTF比赛最让人头疼的往往不是题目本身,而是如何在有限时间内快速分析问题并找到突破口。去年参加DASCTF时,我就深刻体会到了这一点。比赛时间只有3小时,却要完成15道题目,最后还要赶在截止前提交Wr…...