ZBLOG

atomic API 用法

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

基本用法

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

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

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

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

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

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

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

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

示例代码

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

  1. #include <iostream>
  2. #include <thread>
  3. #include <vector>
  4. #include <atomic>
  5. std::atomic<int> counter(0);
  6. void increment(int times) {
  7. for (int i = 0; i < times; ++i) {
  8. counter.fetch_add(1); // 原子递增计数器
  9. }
  10. }
  11. int main() {
  12. const int numThreads = 10;
  13. const int incrementsPerThread = 100;
  14. std::vector<std::thread> threads;
  15. for (int i = 0; i < numThreads; ++i) {
  16. threads.emplace_back(increment, incrementsPerThread);
  17. }
  18. for (auto& thread : threads) {
  19. thread.join(); // 等待所有线程完成
  20. }
  21. std::cout << "Final counter value: " << counter.load() << std::endl; // 输出最终计数器结果
  22. return 0;
  23. }

总结

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?