ZBLOG

std::atomic 的 exchange() 方法的功能?

std::atomic<>exchange() 方法是 C++ 原子操作中的一个关键函数,用于原子地交换原子对象的值并返回其旧值。以下是详细说明:


功能

  1. 原子交换
    将原子对象的当前值替换为指定的新值,并返回替换前的旧值,整个过程是原子的(不会被线程调度打断)。

    • 语法:
      
      T exchange(T desired, std::memory_order order = std::memory_order_seq_cst);
      
    • 参数:
      • desired:要设置的新值。
      • order(可选):内存顺序模型(默认为最严格的顺序一致性 seq_cst)。
  2. 线程安全保证
    在多线程环境中,其他线程无法观察到中间状态,确保操作的完整性和一致性。


使用示例

#include <atomic>
#include <iostream>

int main() {
    std::atomic<int> counter(10);

    // 原子地将 counter 从 10 替换为 20,并返回旧值 10
    int old_value = counter.exchange(20);

    std::cout << "Old value: " << old_value << "\n"; // 输出: Old value: 10
    std::cout << "New value: " << counter.load() << "\n"; // 输出: New value: 20

    return 0;
}

典型应用场景

  1. 实现自旋锁
    ”`cpp std::atomic lock(false);

void acquire_lock() {

   while (lock.exchange(true)) {} // 忙等待直到获取锁

}

void release_lock() {

   lock.store(false);

} “`

  1. 无锁数据结构
    在无锁队列或栈中,用于安全地更新指针或状态标志。

  2. 状态切换
    例如线程池中标记任务状态(空闲/运行)。


内存顺序选项

  • std::memory_order_relaxed:仅保证原子性,无顺序约束。
  • std::memory_order_acquire/release:实现同步机制(如锁)。
  • std::memory_order_seq_cst(默认):严格顺序一致性,性能开销最大但最安全。

与 compare_exchange_strong/weak的区别

  • exchange():直接无条件替换值。
  • compare_exchange_*:仅在当前值与预期值匹配时才替换(更复杂但灵活)。

如果需要简单的“读-改-写”操作且不依赖条件判断,优先使用 exchange()


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23505

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?