目录

std::atomic ::compare_exchange_weak 和 std::atomic ::compare_exchange_strong 

核心原理

函数签名

核心区别

典型用法

1. compare_exchange_weak(循环内重试)

2. compare_exchange_strong(单次尝试)

底层机制

总结


std::atomic<T>::compare_exchange_weak 和 std::atomic<T>::compare_exchange_strong 

核心原理

这两个函数都是 原子比较-交换(Compare-and-Swap, CAS) 操作,属于无锁编程的基础操作。其伪代码逻辑如下:

bool compare_exchange(T& expected, T desired) {if (atomic_value == expected) {atomic_value = desired;  // 交换成功return true;} else {expected = atomic_value;  // 更新 expected 为当前值return false;}
}

关键点:整个操作是原子的(不可中断),用于实现无锁数据结构(如队列、栈)。


函数签名

bool compare_exchange_weak(T& expected, T desired, memory_order success = memory_order_seq_cst,memory_order failure = memory_order_seq_cst);bool compare_exchange_strong(T& expected, T desired,memory_order success = memory_order_seq_cst,memory_order failure = memory_order_seq_cst);

  • expected:传入期望值,失败时会被更新为原子变量的当前值。

  • desired:交换成功时设置的目标值。

  • 内存序success(成功时的内存序)和 failure(失败时的内存序)。


核心区别

特性compare_exchange_weakcompare_exchange_strong
虚假失败可能(即使值相等也返回 false不可能(仅在值不相等时失败)
性能更高(某些平台减少重试开销)稍低(保证严格比较)
适用场景循环内重试(如自旋锁)单次尝试或无循环场景
硬件依赖在 ARM/PowerPC 等平台可能虚假失败所有平台行为一致

典型用法

1. compare_exchange_weak(循环内重试)
std::atomic<int> val(10);
int expected = val.load();  // 获取当前值do {int desired = expected * 2;  // 计算新值// 弱版本允许虚假失败,需配合循环
} while (!val.compare_exchange_weak(expected, desired));
  • 适用场景:自旋锁、无锁队列等需反复重试的操作。

2. compare_exchange_strong(单次尝试)
std::atomic<bool> flag(false);
bool expected = false;// 仅尝试一次,强版本保证无虚假失败
if (flag.compare_exchange_strong(expected, true)) {// 成功获取锁
} else {// 已被其他线程修改
}
  • 适用场景:单次检查或无需重试的逻辑。


底层机制

  • 弱版本
    某些硬件(如 ARM)的 CAS 操作可能因缓存一致性协议(如 MESI)或线程调度导致虚假失败,但硬件实现更高效。

  • 强版本
    在弱版本基础上封装循环,直到成功或真实失败:

bool compare_exchange_strong(...) {while (!compare_exchange_weak(...)) {if (atomic_value != expected) break;  // 真实失败退出}
}

总结

场景推荐函数
循环内重试(如自旋锁)compare_exchange_weak
单次尝试或无循环逻辑compare_exchange_strong
需最高性能(低竞争环境)weak + 循环
需代码简洁性strong(避免手动重试)

最佳实践
在循环中优先使用 weak(如实现无锁栈/队列),非循环场景用 strong。例如:

// 无锁栈的 push 操作
void push(Node* new_node) {Node* old_head = head.load();do {new_node->next = old_head;} while (!head.compare_exchange_weak(old_head, new_node));
}

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

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

相关文章

举出一个异步接口测试的例子

以下是一个完整的 ​异步接口测试​ 实际案例&#xff0c;包含问题场景、解决方案、代码实现和面试回答技巧&#xff0c;适合在面试中展示技术深度&#xff1a; ​案例背景​ ​业务场景​&#xff1a; 测试一个AI图片生成平台的异步接口&#xff0c;用户提交生成请求后&#…

更新麒麟连不上外网

问题&#xff1a;更新麒麟连不上外网 处理&#xff1a;本地建个下载地址 建立文件夹/root/x86.rpm&#xff0c;子文件夹&#xff1a;Packages、repodata&#xff0c;和在线站点建的一样&#xff1a;Index of /NS/V10/V10SP1.1/os/adv/lic/base/x86_64/&#xff0c;然后就下载…

TensorFlow深度学习实战——使用Hugging Face构建Transformer模型

TensorFlow深度学习实战——使用Hugging Face构建Transformer模型 0. 前言1. 安装 Hugging Face2. 文本生成3. 自动模型选择和自动分词4. 命名实体识别5. 摘要生成6. 模型微调相关链接 0. 前言 除了需要实现特定的自定义结构&#xff0c;或者想要了解 Transformer 工作原理外&…

SAP-ABAP:SAP全模块的架构化解析,涵盖核心功能、行业方案及技术平台

一、核心业务模块&#xff08;Logistics & Operations&#xff09; 模块代号核心功能典型流程关键事务码物料管理MM采购/库存/发票校验采购到付款 (P2P)ME21N&#xff08;采购订单&#xff09;, MI31&#xff08;库存盘点&#xff09;销售与分销SD订单/定价/发货/开票订单…

实时预警!机场机坪井室无线智能液位监测系统助力安全降本

某沿海机场因地处多雨区域&#xff0c;每年雨季均面临排水系统超负荷运行压力。经勘测发现&#xff0c;5个井室因长期遭受地下水渗透侵蚀&#xff0c;井壁出现细微结构性裂缝&#xff0c;导致内部水位异常升高。作为机坪地下管网系统的核心节点&#xff0c;这些井室承担着雨水导…

边云协同 AI 视频分析系统设计方案

目录 一、项目背景与目标 二、系统架构概述 总体架构图 三、ER 图&#xff08;核心数据库设计&#xff09; 实体关系图简述 数据表设计&#xff08;简要&#xff09; 四、模型结构图&#xff08;边缘云端AI推理架构&#xff09; 边缘模型&#xff08;YOLOv5-tiny/PP-YO…

vue3整合element-plus

为项目命名 选择vue 框架 选择TS 启动测试&#xff1a; npm run dev 开始整合 element-plus npm install element-plus --save npm install unplugin-vue-components unplugin vitejs/plugin-vue --save-dev 修改main.ts import { createApp } from vue import ./style.cs…

【AI 测试】测试用例设计:人工智能语言大模型性能测试用例设计

目录 一、性能测试可视化架构图 &#xff08;1&#xff09;测试整体架构图 &#xff08;2&#xff09;测试体系架构图 &#xff08;3&#xff09;测试流程时序图 二、性能测试架构总览 &#xff08;1&#xff09;性能测试功能点 &#xff08;2&#xff09;测试环境要…

Windsurf SWE-1模型评析:软件工程的AI革命

引言 软件开发领域正经历着前所未有的变革&#xff0c;AI辅助编程工具层出不穷&#xff0c;但大多数仅专注于代码生成这一环节。Windsurf公司近期推出的SWE-1系列模型打破了这一局限&#xff0c;首次将AI应用扩展至软件工程的全流程。这一举措不仅反映了行业对AI工具认知的深化…

Qt for OpenHarmony 编译鸿蒙调用的动态库

简介 Qt for Harmony​ 是跨平台开发框架 ​Qt​ 与华为 ​OpenHarmony​ 操作系统的深度集成方案&#xff0c;由 Qt Group 与华为联合推动。其核心目标是为开发者提供一套高效工具链&#xff0c;实现 ​​“一次开发&#xff0c;多端部署”​&#xff0c;加速 OpenHarmony 生…

退休时,按最低基数补缴医疗保险15年大概需要多少钱

在南京退休时&#xff0c;如果医保缴费年限不足&#xff08;男需满25年/女需满20年&#xff09;&#xff0c;需补缴差额年限。若按最低基数一次性补缴15年医保&#xff0c;费用估算如下&#xff08;以2024年政策为例&#xff09;&#xff1a; 一、补缴金额计算公式 总补缴费用…

wireshark过滤显示rtmp协议

wireshark中抓包显示的数据报文中&#xff0c;明明可以看到有 rtmp 协议的报文&#xff0c;但是过滤的时候却显示一条都没有 查看选项中的配置&#xff0c;已经没有 RTMP 这个协议了&#xff0c;已经被 RTMPT 替换了&#xff0c;过滤框中输入 rtmpt 过滤即可

《哈希表》K倍区间(解题报告)

文章目录 零、题目描述一、算法概述二、算法思路三、代码实现四、算法解释五、复杂度分析 零、题目描述 题目链接&#xff1a;K倍区间 一、算法概述 计算子数组和能被k整除的子数组数量的算法。通过前缀和与哈希表的结合&#xff0c;高效地统计满足条件的子数组。  需要注…

OpenShift 在 Kubernetes 多出的功能中,哪些开源?

OpenShift 在 Kubernetes 基础上增加的功能中&#xff0c;部分组件是开源的&#xff08;代码可公开访问&#xff09;&#xff0c;而另一些则是 Red Hat 专有&#xff08;闭源&#xff09;。以下是详细分类&#xff1a; 1. 完全开源的功能&#xff08;代码可查&#xff09; 这些…

【每天一个知识点】CITE-seq 技术

一、技术背景 单细胞RNA测序&#xff08;scRNA-seq&#xff09;自问世以来&#xff0c;极大推动了细胞异质性和组织复杂性的研究。但RNA水平并不能完全代表蛋白质水平&#xff0c;因为蛋白质的表达受转录后调控、翻译效率及蛋白降解等多种因素影响。此外&#xff0c;许多细胞类…

中文Windows系统下程序输出重定向乱码问题解决方案

导言 最近我在用 Rust 开发时&#xff0c;遇到了一个让人头疼的问题&#xff1a;运行 cargo run -- version Cargo.toml > output.txt 将输出重定向到文件后&#xff0c;打开 output.txt 却发现里面全是乱码&#xff01;我的程序确实是UTF8但是输出的文件却是UTF16LE编码的…

Python管理工具UV

常用 UV 命令 安装 pip install uv 版本相关 uv python list 打印所有uv支持的python版本uv python install cpython-3.12 安装指定的python版本uv run -p 3.12 test.py 用指定的python版本运行python代码uv run -p 3.12 python 进入python执行环境。假如输入的版本是一个本…

论文略读:ASurvey on Intent-aware Recommender Systems

202406 arxiv 推荐系统在许多现代在线服务中发挥着关键作用&#xff0c;例如电子商务或媒体流服务&#xff0c;它们能够为消费者和服务提供商创造巨大的价值。因此&#xff0c;过去几十年来&#xff0c;研究人员提出了大量生成个性化推荐的技术方法。传统算法——从早期的 Gro…

Neo4j 中存储和查询数组数据的完整指南

Neo4j 中存储和查询数组数据的完整指南 图形数据库 Neo4j 不仅擅长处理节点和关系&#xff0c;还提供了强大的数组(Array)存储和操作能力。本文将全面介绍如何在 Neo4j 中高效地使用数组&#xff0c;包括存储、查询、优化以及实际应用场景。 数组在 Neo4j 中的基本使用 数组…

Android 编译和打包image镜像流程

1. 编译命令 source build/envsetup.sh lunch aosp_car_arm64-userdebug make2. 编译流程 source build/envsetup.sh 定义一些函数的环境变量&#xff0c;如 lunchvalidate_current_shell&#xff0c;确认 shell 环境set_global_paths&#xff0c;设置环境变量 ANDROID_GLOB…