当前位置: 首页 > news >正文

C++11中atomic

C++11中atomic

在C++中,std::atomic 是一个非常重要的工具,主要用于实现线程安全的操作。它属于C++11标准引入的 <atomic> 头文件的一部分,用于处理多线程环境下的原子操作。以下是 std::atomic 的主要作用和特点:

1. 保证操作的原子性

原子操作是指一个不可分割的操作,它在执行过程中不会被其他线程中断。std::atomic 可以确保对变量的读取、修改和写入操作是原子性的,即使在多线程环境下也不会出现竞态条件(Race Condition)。

例如,普通的整数变量操作可能被编译器或硬件拆分成多个步骤,但在多线程环境下,这些步骤可能会被其他线程打断,从而导致数据不一致。而 std::atomic 可以保证这些操作是完整的、不可分割的。

std::atomic<int> counter(0);
counter++;  // 原子操作,不会被打断

2. 线程安全

std::atomic 提供了一种轻量级的线程安全机制。它可以用于保护共享变量,避免多线程访问时的冲突。与互斥锁(std::mutex)相比,std::atomic 更高效,因为它不需要操作系统级别的锁机制,而是通过硬件支持的原子指令来实现。

#include <iostream>
#include<atomic>
#include<thread>
#include<vector>
using namespace std;

std::atomic<int> g_Count = 0;

void IncrementCounter()
{
    for (int i = 0; i < 10000; i++)
    {
        // 线程安全的原子操作
        g_Count++;
    }
}

int main()
{
    std::vector<thread> vtThreads;

    for(int i=0;i<10;i++)
    {
        vtThreads.emplace_back(IncrementCounter);
    }

    for(auto& t: vtThreads)
    {
        t.join();
    }

    std::cout << "Final value:"<< g_Count << endl;
    std::cout << "Hello World!\n";
}

代码运行结果:

微信截图_20250305233946

3. 内存序(Memory Ordering)

std::atomic 还提供了对内存序的控制,用于解决多线程环境下的内存可见性和指令重排序问题。C++ 提供了多种内存序选项,例如 std::memory_order_seq_cst(顺序一致性)、std::memory_order_acquire(获取)、std::memory_order_release(释放)等。

这些内存序选项允许程序员更精细地控制线程之间的同步和可见性,从而优化多线程程序的性能。

4. 支持多种数据类型

std::atomic 不仅可以用于基本数据类型(如 intfloatbool 等),还可以用于指针类型和用户自定义类型(通过特化模板)。这使得它在多线程编程中非常灵活。

std::atomic<int*> atomic_ptr(nullptr);

void set_pointer(int* ptr) {
    atomic_ptr.store(ptr, std::memory_order_release);
}

void get_pointer() {
    int* ptr = atomic_ptr.load(std::memory_order_acquire);
    // 使用 ptr
}

5. 性能优势

与传统的互斥锁相比,std::atomic 通常具有更好的性能,因为它依赖于硬件的原子指令,而不是操作系统级别的锁。在某些场景下,使用 std::atomic 可以显著减少线程同步的开销。

总结

std::atomic 是C++中实现线程安全和原子操作的重要工具。它不仅能够保证操作的原子性,还可以通过内存序控制解决复杂的多线程同步问题。在设计多线程程序时,合理使用 std::atomic 可以提高代码的效率和可维护性。


文章转载自:

http://mq9VbUUC.gbkkt.cn
http://e0WdNNax.gbkkt.cn
http://C6NJZVvu.gbkkt.cn
http://y3feQMl5.gbkkt.cn
http://gWSUEzEz.gbkkt.cn
http://b0OUadkP.gbkkt.cn
http://THKkgy5C.gbkkt.cn
http://wmy5mLEl.gbkkt.cn
http://oHYajuBH.gbkkt.cn
http://0wAoCLg0.gbkkt.cn
http://t8trLgyc.gbkkt.cn
http://b3Zf5JUE.gbkkt.cn
http://sUH2tZi6.gbkkt.cn
http://9Z7FCX0C.gbkkt.cn
http://hUyVbJqE.gbkkt.cn
http://LbjQMI2z.gbkkt.cn
http://Gr84URHH.gbkkt.cn
http://PLf0Yxd4.gbkkt.cn
http://vha3hodD.gbkkt.cn
http://4xFlZvGv.gbkkt.cn
http://Y8vAi4TA.gbkkt.cn
http://0Cf1A6ED.gbkkt.cn
http://ekFsDjRb.gbkkt.cn
http://pDBQzGHu.gbkkt.cn
http://OWcGCJNX.gbkkt.cn
http://ztOuJiLX.gbkkt.cn
http://CJfCqbwp.gbkkt.cn
http://XwOl6KaD.gbkkt.cn
http://kQVsxuV2.gbkkt.cn
http://LKSc5eYc.gbkkt.cn
http://www.dtcms.com/a/51493.html

相关文章:

  • YOLOv8改进------------SPFF-LSKA
  • vscode 配置debug的环境
  • 【简单的C++围棋游戏开发示例】
  • 构建AI私有化智能知识库的开源利器 AnythingLLM
  • HarmonyOS Next~应用开发入门:从架构认知到HelloWorld实战
  • 网安高级课第六次作业
  • AI Agent爆发的算力密码:需求、趋势与革新
  • JavaScript 图片 灰度算法 双线性插值
  • 【每日学点HarmonyOS Next知识】截图组件截取列表、Toggle组件、Web组件请求头、列表选择弹窗、游戏加速
  • 【橘子python】在vscode中配置py3
  • 关于2023新版PyCharm的使用
  • Python:函数的各类参数以及函数嵌套
  • Vue.js 监听属性
  • STM32F407IGT的USB功能
  • mysql下载与安装
  • 算法-回溯篇09-子集 II
  • 深度探索:美团开源DeepSeek R1 INT8量化技术的性能革命
  • 【每日论文】o3-mini vs DeepSeek-R1: Which One is Safer?
  • idea中的WebFacet到底是啥?
  • 【练习】【二叉树】力扣热题100 94. 二叉树的中序遍历
  • 前端基础之脚手架
  • windows 利用nvm 管理node.js 2025最新版
  • PyQt5 图形标注工具开发教程(可扩展)
  • SAP(第3周)
  • 【C++教程】ASCII码的基本概念
  • Linux--基本指令4(完结)和权限
  • 里氏替换原则(LSP)理解
  • 996引擎-M2设置笔记
  • 一键生成PPT,AI让工作变得轻松高效
  • Mysql存储引擎