news 2026/5/19 1:47:49

compare_exchange_weak 的用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
compare_exchange_weak 的用法

compare_exchange_weak是 C++ 原子库中用于执行比较并交换(CAS)操作的函数,它原子地比较原子变量的当前值与期望值,如果相等则更新为目标值,否则更新期望值为当前值。

bool compare_exchange_weak(T& expected, T desired, std::memory_order success = std::memory_order_seq_cst, std::memory_order failure = std::memory_order_seq_cst) noexcept;
参数类型说明
expectedT&(引用)期望值。成功时不变;失败时被更新为原子变量的当前值
desiredT目标值。成功时原子变量被更新为此值
successmemory_order成功时的内存序(默认最严格)
failurememory_order失败时的内存序(默认最严格)

返回值:

  • true:交换成功,原子变量被更新为desired
  • false:交换失败,expected被更新为原子变量的当前值

关键点:整个操作是原子的,不可中断。

核心行为(伪代码)

bool compare_exchange_weak(T& expected, T desired) { if (atomic_value == expected) { atomic_value = desired; // 成功:更新原子变量 return true; } else { expected = atomic_value; // 失败:更新期望值为当前值 return false; } }

典型用法:循环内重试

由于weak可能虚假失败,必须配合循环使用

std::atomic<int> val(10); // 正确用法:do-while 循环 int expected = val.load(); do { int desired = expected * 2; // 计算新值 } while (!val.compare_exchange_weak(expected, desired)); // 或者使用 while 循环 int expected = val.load(); while (!val.compare_exchange_weak(expected, expected * 2)) { // expected 已被更新为最新值,继续重试 }

实际应用场景

1. 原子计数器
std::atomic<int> counter(0); void increment() { int expected = counter.load(); while (!counter.compare_exchange_weak(expected, expected + 1)) { // expected 自动更新为最新值,继续重试 } }
2. 自旋锁
std::atomic<bool> lock(false); void acquire_lock() { bool expected = false; while (!lock.compare_exchange_weak(expected, true)) { expected = false; // 重置 expected,准备下次尝试 } } void release_lock() { lock.store(false); }
3. 无锁栈的 push 操作
struct Node { int value; Node* next; }; std::atomic<Node*> head(nullptr); void push(int val) { Node* new_node = new Node{val, nullptr}; Node* expected = head.load(); do { new_node->next = expected; } while (!head.compare_exchange_weak(expected, new_node)); }

常见错误

错误1:不使用循环
// ❌ 错误:可能虚假失败 int expected = val.load(); val.compare_exchange_weak(expected, desired); // 可能无声失败
错误2:循环内不更新expected
// ❌ 错误:expected 没有重置 while (!val.compare_exchange_weak(expected, desired)) { // expected 已被更新,但这里没有重新计算 desired // 如果 desired 依赖于 expected,需要重新计算 }
错误3:混淆weakstrong
// ❌ 错误:单次尝试用 weak if (flag.compare_exchange_weak(expected, true)) { // 可能虚假失败 // 获取锁 } // ✅ 正确:单次尝试用 strong if (flag.compare_exchange_strong(expected, true)) { // 获取锁 }

总结

场景推荐函数说明
循环内重试(自旋锁、无锁队列)compare_exchange_weak性能更高,循环处理虚假失败
单次尝试(无循环)compare_exchange_strong保证无虚假失败,更可靠
低竞争环境weak+ 循环最高性能
需要代码简洁性strong避免手动重试

最佳实践:在循环中优先使用weak,非循环场景使用strong

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/19 1:42:32

Windows Node.js版本管理实战:NVM-Windows配置与部署解决方案

Windows Node.js版本管理实战&#xff1a;NVM-Windows配置与部署解决方案 【免费下载链接】nvm-windows A node.js version management utility for Windows. Ironically written in Go. 项目地址: https://gitcode.com/gh_mirrors/nv/nvm-windows NVM-Windows是Windows…

作者头像 李华
网站建设 2026/5/19 1:41:25

和大模型对话案例1

第一次提问&#xff1a; 工作时间显示不正确&#xff0c;需要精确到分钟&#xff0c;现在下午14:30开始&#xff0c;实际上显示的是15:00开始结果运行了半个小时没有运行出来 第二次提问&#xff1a; 工作时间显示不正确&#xff0c;需要精确到分钟&#xff0c;现在下午14:30开…

作者头像 李华
网站建设 2026/5/19 1:35:02

Legacy iOS Kit终极指南:如何让经典iOS设备重获新生

Legacy iOS Kit终极指南&#xff1a;如何让经典iOS设备重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit iO…

作者头像 李华
网站建设 2026/5/19 1:33:03

编程范式学习笔记

什么是编程范式 编程范式&#xff08;Programming Paradigm&#xff09;是程序设计的思想体系与方法论&#xff0c;它定义了开发者组织代码、管理状态、控制执行流程的核心方式&#xff0c;决定了开发者如何建模问题、拆解逻辑&#xff0c;最终影响代码的可读性、可维护性与可扩…

作者头像 李华
网站建设 2026/5/19 1:31:13

基础知识丨JAVA序列化与反序列化漏洞

今天在学习的时候又接触到了JAVA反序列化漏洞。一直只知道JAVA反序列化就是利用反序列化工具进行攻击&#xff0c;在目标系统中执行命令&#xff0c;利用的就是传输对象时采用JAVA序列化。但是也只知道这么多了。所以&#xff0c;就想着今天再了解一下反序列化漏洞。顺便&#…

作者头像 李华
网站建设 2026/5/19 1:30:50

毫米波雷达3D重建技术:挑战与RFconstruct系统创新

1. 毫米波雷达3D重建技术概述在自动驾驶感知系统中&#xff0c;毫米波雷达因其独特的物理特性正扮演着越来越关键的角色。与激光雷达和摄像头相比&#xff0c;工作在76-81GHz频段的毫米波雷达具有穿透雾霾、雨雪的能力&#xff0c;且不受光照条件影响&#xff0c;这使其成为全天…

作者头像 李华