compare_exchange_weak 和compare_exchange_strong区别

C++11:原子交换函数compare_exchange_weak和compare_exchange_strong 初探 compare_exchange_weak和compare_exchange_strong则是著名的CAS(compare and set) 阅读详情
AI摘要

本文介绍了C++中compare_exchange_weak和compare_exchange_strong的区别。compare_exchange_weak可能伪失败,实现高效但需循环重试;compare_exchange_strong无伪失败,但可能有额外开销。前者适用于可接受重试场景,后者适用于对确定性要求高的场景,使用时需按需选择。


compare_exchange_weak 和 compare_exchange_strong 都是 std::atomic 类提供的成员函数,用于执行原子的比较和交换(Compare-And-Swap,CAS)操作。它们的主要功能都是比较原子变量的当前值与期望的值,如果相等则将原子变量更新为新值,但两者存在一些区别

1. 伪失败情况

  • compare_exchange_weak:可能会出现伪失败的情况。即使原子变量的当前值与期望的值相等,compare_exchange_weak 操作也可能返回 false,表示比较和交换操作失败。这是因为在某些硬件平台上,compare_exchange_weak 的实现更为高效,它利用了硬件的特性,但这种特性可能会导致偶尔的伪失败。
  • compare_exchange_strong:不会出现伪失败的情况。如果原子变量的当前值与期望的值相等,compare_exchange_strong 操作一定会将原子变量更新为新值,并返回 true;只有当原子变量的当前值与期望的值不相等时,才会返回 false。

2. 性能差异

  • compare_exchange_weak:由于可能出现伪失败,通常需要在代码中使用循环来重试操作,直到操作成功为止。但在一些硬件平台上,compare_exchange_weak 的实现更接近硬件的原子操作,因此性能相对较高。特别是在需要频繁进行比较和交换操作的场景中,使用 compare_exchange_weak 可以减少开销。
  • compare_exchange_strong:虽然不会出现伪失败,但它的实现可能会引入额外的开销,以确保操作的确定性。因此,在性能上可能会比 compare_exchange_weak 稍差一些。

3. 使用场景

  • compare_exchange_weak:适用于需要频繁进行比较和交换操作,并且可以接受偶尔的重试的场景。例如,在无锁队列的实现中,通常会使用 compare_exchange_weak 来更新队列的头指针或尾指针,因为即使操作偶尔失败,也可以通过循环重试来保证最终的正确性。
#
【C/C++】无锁编程——compare_exchange_strong 原子操作之compare_exchange_strong 阅读详情

相关推荐

简单理解compare_exchange_weak函数

compare_exchange_weak比compare_exchange_strong

勿忘初心,方得始终 5373

深入解析std::atomic的exchange与compare_exchange操作

线程1读取值A线程2修改值为B线程3修改值为A线程1的CAS操作成功(值仍为A),但数据结构已改变ABA问题详细介绍exchange当需要无条件设置新值并获取旧值时使用适合标志位切换、所有权转移在循环中更新值时首选无锁数据结构的核心高性能要求的场景当需要单次尝试时避免虚假失败的场景简化错误处理逻辑“选择正确的原子操作,如同选择正确的锁——它决定了并发性能的边界。” - C++并发艺术。

牟同學的博客 1815

交易系统开发技能及面试之无锁编程(Lock-free)

目录概要Q1 什么是atomic?Q2 alignas 关键字Q3 C++的内存模型 relaxed ordering, release-acquire ordering, sequentially consistent ordering 概要 这一章内容主要讲解无锁编程相关技能,在生产中,为了解决线程间资源共享问题,最常用的方式就是加锁了,这在上一章并发编程也讲到过很多。关于无锁的时候,也写过一篇无锁队列的实现,而今天这篇文章主要是讲解无锁编程所需要了解的基础知识,比如atomics,内存模型,内存排序等

BBinChina的专栏 851

C++原子布尔类型std::atomic_bool:原理、内存序与并发实战

在多线程编程中,数据竞争是导致程序行为不确定性的核心挑战之一。其根本原因在于多个线程对共享数据的非原子访问,破坏了数据的一致性。为了解决这一问题,现代编程语言引入了原子操作的概念,它保证了单个操作的不可分割性,从而成为构建线程安全程序的基础。原子操作的技术价值在于,它能够在无需传统互斥锁的情况下,实现高效的线程间同步,显著提升并发程序的性能。这一特性在操作系统内核、高性能服务器、无锁数据结构等对性能要求苛刻的场景中尤为重要。C++标准库通过`<atomic>`头文件提供了一系列原子类型,其中`std::at

weixin_34297704的博客 391

C++11:原子交换函数compare_exchange_weak和compare_exchange_strong

我们知道在C++11中引入了mutex和方便优雅的lock_guard。但是有时候我们想要的是性能更高的无锁实现,下面我们来讨论C++11中新增的原子操作类Atomic,我们可以利用它巧妙地实现无锁同步。 CAS(Compare and Swap)是个原子操作,保证了如果需要更新的地址没有被他人改动多,那么它可以安全的写入。而这也是我们对于某个数据或者数据结构加锁要保护的内容,保证读写的一致性,不出现dirty data。现在几乎所有的CPU指令都支持CAS的原子操作。 Atomic C+...

feikudai8460的博客 5万+

深入理解C++原子操作与线程同步

本文详细介绍了C++中std::atomic及其相关类模板的使用,包括基本原子接口和如何用std::atomic<bool>实现条件变量。文章通过示例程序展示了如何使用原子标志进行线程同步,并解释了不同原子类型间接口的差异和适用性。通过深入探讨std::atomic的成员函数,如compare_exchange_strong和compare_exchange_weak,文章阐述了这些原子操作在多线程编程中的重要性和用法。

weixin_35756373的博客 405

LC整流滤波电路DIY:电感电容配合,手把手搭建低纹波直流电源

在直流电源设计中,整流滤波是连接交流输入与稳定输出的关键环节。常见的电容滤波虽然简单,但在大负载下纹波抑制能力有限,电感抵抗电流突变、电容抵抗电压突变,二者组合构成的LC滤波能有效降低输出电压纹波,同时减小开机浪涌电流。在工频线性电源、功放电源等对噪声敏感的场景中,LC滤波常作为稳压前的平滑缓冲。本文以一套完整DIY项目为线索,介绍整流桥后串联功率电感、并联滤波电容的电路构成,结合实际计算与波形测试,讨论电感量估算、电容选取、谐振风险、饱和电流等工程问题,并给出上电测试和故障排查方法。通过搭建与调试,可直观

weixin_29168813的博客 378

用STM32CubeMX和HAL库,5分钟搞定TB6612驱动直流电机(附完整代码)

本文详细介绍了如何使用STM32CubeMX和HAL库快速配置TB6612驱动直流电机,包括硬件连接、CubeMX工程配置、电机驱动逻辑实现及进阶优化技巧。通过图形化工具和代码示例,即使是新手也能在5分钟内完成电机调速系统的搭建,大幅提升开发效率。

weixin_26854829的博客 266

AI赋能工业自动化:传感器大数据实战

工业自动化中AI与传感器大数据的结合,显著提升了生产效率与可靠性。关键技术包括实时数据处理、边缘计算和数字孪生,未来将进一步向自主决策系统演进。

AFAGA_x的博客 416

YOLOv11改进 ,YOLOv11改进主干网络为MobileNetV3,助力涨点

MobileNetV3通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法,通过新颖的架构改进进一步提升了性能。本文开始探讨了自动化搜索算法与网络设计如何协同工作,以利用互补方法来提升整体技术水平。通过这一过程,创建了两个新的MobileNet模型:MobileNetV3-Large和MobileNetV3-Small,分别针对高资源和低资源使用场景。这些模型随后被适配并应用于目标检测和语义分割任务。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1937

使用R语言实战:构建Logistic回归模型

Logistic回归是一种基于概率的分类算法,它用于预测离散的结果变量(也称为响应变量或因变量)。与线性回归不同,Logistic回归的输出是一个概率值,通常在0和1之间。这使得它非常适合处理二分类问题。市场营销:预测客户是否会购买某个产品。医学研究:预测疾病的发生与否。信用风险评估:预测个人申请贷款的违约风险。社会科学:预测个人对某个政策的态度。

2301_79331230的博客 1140

第14.1章 高翔博士2025年11月最新开源框架Lightning-LM源码学习解读(一):激光-IMU定位+建图算法各模块简介

Lightning-LM:高效激光SLAM定位系统 该框架基于模块化设计,通过激光-IMU融合实现快速建图与定位,核心特点包括: 极速性能:纯CPU运行(建图1.2核/定位0.8核) 模块化架构:包含激光里程计(LIO)、地图管理、回环检测等独立模块 动态场景支持:地图分块加载、动静态图层分离 多模式适配:支持ROS2环境下的在线/离线运行 关键模块包括前端里程计(core/lio)、2D/3D地图转换(core/g2p5)、轻量优化库(core/miao)等,通过系统控制器(core/system)协调流

行知SLAM 2439

CKS-CN考试之路----11

显然是alpine-b的镜像有libcrypto3-3.1.4-r5。新版本发布老版本会被回收,此时pod只剩下2个container。我们依次测试是哪个镜像里包含libcrypto3。可以看到alpine的pod有3个副本.

Q先生 655

20 Embedding 与向量检索:语义为什么能变成距离

Embedding 是 RAG 语义检索的数学基础。本文用工程视角讲清文本如何变成向量,为什么语义相近会表现为距离相近,Top-K 检索如何工作,以及在模型选择、同模型约束、精确匹配和召回评估上的常见坑。

老于的笔记的专栏 6204

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: C++`std::this_thread::yield()
下一篇: compare_exchange_weak功能
越甲八千
博客等级 码龄11年 2959粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值