值得一看
广告
彩虹云商城
广告

热门广告位

c++中std::atomic是什么_c++原子操作与并发安全讲解

<p>std::atomic 是 C++ 中用于实现多线程环境下原子操作的核心工具,确保对共享变量的读、写和复合操作不可分割,避免数据竞争。原子操作指操作在执行中不会被中断,要么完全执行,要么不执行,无中间状态。例如,多个线程同时对普通变量进行 i++ 操作可能导致结果错误,因其包含“读-改-写”三步,而使用 std::atomic<int> 可保证该操作原子性,结果正确。常见用法包括 std::atomic<int> counter{0}、std::atomic<bool> ready{false} 等,支持整型、指针等类型。主要操作有 load()(原子读)、store(val)(原子写)、exchange(val)(替换并返回旧值)、compare_exchange_weak/strong(比较并交换,CAS,用于无锁编程)、fetch_add()/fetch_sub()(原子加减并返回原值),且对整型和指针支持 ++、– 运算符重载。示例代码中两个线程各对 atomic 变量自增 1000 次,最终结果为 2000,体现其正确性。内存序(Memory Order)控制原子操作的同步行为与性能,默认为 std::memory_order_seq_cst(顺序一致性,最安全但性能较低)。其他选项包括 memory_order_relaxed(仅保证</p>

c++中std::atomic是什么_c++原子操作与并发安全讲解

std::atomic 是 C++ 中用于实现原子操作的核心工具,它能确保对共享数据的操作在多线程环境下不会出现数据竞争,从而保证并发安全。简单来说,使用 std::atomic 的变量,其读、写或复合操作(如自增)是“不可分割”的——其他线程无法观察到中间状态。

什么是原子操作?

原子操作是指一个操作在执行过程中不会被线程调度机制打断。也就是说,该操作要么完全执行,要么完全不执行,不存在部分完成的状态。在多线程编程中,多个线程同时访问同一变量时,如果没有同步机制,就会导致未定义行为。

例如,两个线程同时对一个普通整型变量执行 i++,由于 i++ 实际包含“读-改-写”三个步骤,可能两个线程都读取了旧值,各自加1后再写回去,最终只加了一次,造成数据丢失。

而如果这个变量是 std::atomic<int> 类型,则 ++ 操作会以原子方式完成,结果正确。

std::atomic 的基本用法

你可以将 std::atomic 用于整型、指针等支持原子操作的类型:

  • std::atomic<int> counter{0};
  • std::atomic<bool> ready{false};
  • std::atomic<int*> ptr{nullptr};

常用操作包括:

  • load():原子地读取值
  • store(val):原子地写入值
  • exchange(val):原子地替换值并返回旧值
  • compare_exchange_weak/strong(expected, desired):比较并交换(CAS),是实现无锁编程的基础
  • fetch_add(), fetch_sub():原子加减并返回原值
  • 对整型和指针类型,还支持 ++-- 等运算符重载

示例代码:

立即学习“C++免费学习笔记(深入)”;

#include <atomic>
#include <thread>
#include <iostream>
std::atomic<int> count{0};
void increment() {
for (int i = 0; i < 1000; ++i) {
count.fetch_add(1);
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Final count: " << count.load() << "\n"; // 输出 2000
}

内存序(Memory Order)控制性能与可见性

std::atomic 操作允许指定内存序,用来控制操作的内存同步行为。默认使用 std::memory_order_seq_cst(顺序一致性),最安全但可能影响性能。

PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用

PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用

一键操作,智能生成专业级PPT

PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用37

查看详情
PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用

常见内存序选项:

  • memory_order_relaxed:仅保证原子性,不保证顺序。适合计数器等无需同步场景
  • memory_order_acquire:用于读操作,保证后续读写不会被重排到该操作之前
  • memory_order_release:用于写操作,保证之前的读写不会被重排到该操作之后
  • memory_order_acq_rel:结合 acquire 和 release
  • memory_order_seq_cst:最强一致性,所有线程看到相同操作顺序

例如:

count.store(1, std::memory_order_release);
int val = count.load(std::memory_order_acquire);

这种配对常用于实现自定义同步机制,如自旋锁或无锁队列。

原子操作的限制与注意事项

std::atomic 并非万能,使用时需注意:

  • 不是所有类型都能特化为 atomic。例如 std::atomic<std::string> 不合法,因为字符串操作无法原子化
  • 复合操作(如先检查再修改)仍需谨慎,应使用 compare_exchange 循环实现
  • 过度使用 memory_order_seq_cst 可能降低性能,应根据需求选择合适的内存序
  • 原子变量不能拷贝构造或赋值,只能通过 load/store 或原子操作修改

基本上就这些。std::atomic 提供了高效且灵活的并发控制手段,尤其适用于轻量级同步场景。掌握它,是写出高性能、线程安全 C++ 代码的重要一步。

相关标签:

c++ 工具 ai ios stream 数据丢失 无锁 同步机制 red String 运算符 整型 字符串 bool int 循环 指针 指针类型 运算符重载 线程 多线程 并发

大家都在看:

c++中如何使用lambda表达式_c++ lambda表达式语法与应用示例
c++怎么实现一个简单的线程池_c++ 简单线程池实现方法
c++中怎么连接两个string_c++字符串拼接方法
c++中nullptr和NULL的区别_c++ nullptr与NULL区别说明
c++中右值引用(&&)是用来做什么的_c++右值引用与移动语义解析
温馨提示: 本文最后更新于2025-10-16 22:27:39,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞10赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容