ZBLOG

atomic API 用法

在 C++ 中,std::atomic 是一个用于实现原子操作的 API,主要用于多线程编程,以确保对共享数据的安全访问。它提供了一种简单的方法来创建和管理原子类型的变量,避免了使用传统的锁机制。

基本用法

  1. 包含头文件: 要使用 std::atomic,需要包含头文件 <atomic>
   #include <atomic>
  1. 定义原子变量: 可以使用 std::atomic 来定义基本数据类型的原子变量,例如整数、布尔值等。
   std::atomic<int> atomicInt(0); // 定义一个初始值为 0 的原子整数
   std::atomic<bool> atomicBool(false); // 定义一个初始值为 false 的原子布尔值
  1. 常用操作

    • 加载(load): 读取原子变量的值。

      int value = atomicInt.load();
      
    • 存储(store): 设置原子变量的值。

      atomicInt.store(5);
      
    • 交换(exchange): 将当前值替换为新值,并返回旧值。

      int oldValue = atomicInt.exchange(10);
      
    • 比较并交换(compare_exchange_weak 和 compare_exchange_strong): 如果当前值等于期望值,则将其替换为新值。返回是否成功。

      • compare_exchange_weak:在失败时可能会导致自旋,所以通常用于循环中。
       int expected = 5;
       if (atomicInt.compare_exchange_weak(expected, 20)) {
           // 成功地将 atomicInt 的内容从 5 改为 20
       } else {
           // 没有改变,因为当前内容不是预期的 expected 值
       }
    
    • compare_exchange_strong:比 compare_exchange_weak 更强,不易出现自旋,但可能引发更多内存顺序问题。
  2. 算术操作

C++11 中还提供了一些直接支持加减操作的方法。

   atomicInt.fetch_add(1); // 原子的将 current 值增加 1,并返回增加前的值。
   
   atomicInt.fetch_sub(1); // 原子的将 current 值减少 1,并返回减少前的值。

示例代码

下面是一个简单示例,演示如何使用 std::atomic 在多个线程中安全地更新计数器:

#include <iostream>
#include <thread>
#include <vector>
#include <atomic>

std::atomic<int> counter(0);

void increment(int times) {
    for (int i = 0; i < times; ++i) {
        counter.fetch_add(1); // 原子递增计数器
    }
}

int main() {
    const int numThreads = 10;
    const int incrementsPerThread = 100;

    std::vector<std::thread> threads;

    for (int i = 0; i < numThreads; ++i) {
        threads.emplace_back(increment, incrementsPerThread);
    }

    for (auto& thread : threads) {
        thread.join(); // 等待所有线程完成
    }

    std::cout << "Final counter value: " << counter.load() << std::endl; // 输出最终计数器结果

    return 0;
}

总结

  • std::atomic 提供了一种方便、安全地进行并发编程的方法,可以有效避免竞争条件和死锁等问题。
  • 在高并发场景中,合理使用原子操作可以显著提高程序性能和响应速度。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?