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

热门广告位

c++中std::atomic是什么,如何使用_c++原子操作与并发安全解析

std::atomic是C++中用于保证共享变量操作原子性的模板类,定义在<atomic>头文件中,支持int、bool、指针等平凡可复制类型,通过load、store、exchange和compare_exchange_weak/strong等成员函数实现线程安全的读取、写入和比较交换操作,避免数据竞争;其操作可指定内存序(如memory_order_relaxed、acquire/release、seq_cst),其中seq_cst为默认且最严格;常用于实现无锁编程,但不支持拷贝构造与赋值,复杂同步仍需配合互斥锁使用。

c++中std::atomic是什么,如何使用_c++原子操作与并发安全解析

在C++多线程编程中,std::atomic 是用于实现原子操作的核心工具。它确保对共享数据的读取、修改和写入操作不会被多个线程同时干扰,从而避免数据竞争(data race),保证并发安全。

什么是 std::atomic?

std::atomic 是一个模板类,定义在 <atomic> 头文件中,用于封装某种类型的变量(如 int、bool、指针等),使其操作具有原子性。这意味着在多线程环境下,对该变量的操作是不可分割的——不会出现中间状态被其他线程观察到的情况。

常见的原子类型包括:

  • std::atomic<int>
  • std::atomic<bool>
  • std::atomic<T*>(用于原子指针)
  • C++17 起还提供了 std::atomic_flag(最轻量的原子布尔标志)

为什么需要原子操作?

在没有原子操作的情况下,多个线程对同一变量进行递增操作可能会导致结果错误。例如:

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

int counter = 0;
// 多个线程执行 counter++;

看似简单的操作实际上包含“读-改-写”三个步骤,在并发场景下可能交错执行,最终结果小于预期。

使用 std::atomic 可以解决这个问题:

#include <atomic>
#include <thread>
#include <vector>
std::atomic<int> counter(0);
void increment() {
for (int i = 0; i < 1000; ++i) {
counter++;  // 原子递增,线程安全
}
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
threads.emplace_back(increment);
}
for (auto& t : threads) {
t.join();
}
// 最终 counter 的值一定是 10000
return 0;
}

常用原子操作与内存序

std::atomic 提供了多种成员函数来执行不同语义的原子操作:

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如何使用

  • load():原子地读取值
  • store(val):原子地写入值
  • exchange(val):设置新值并返回旧值
  • compare_exchange_weak()compare_exchange_strong():比较并交换(CAS),是实现无锁算法的基础

这些操作可以接受一个可选的内存序(memory order)参数,控制操作的内存同步行为。常用的有:

  • std::memory_order_relaxed:最宽松,仅保证原子性,不保证顺序
  • std::memory_order_acquire / release:用于实现锁或同步点
  • std::memory_order_seq_cst:默认选项,提供最严格的顺序一致性,安全性最高但性能略低

示例:使用 compare_exchange_strong 实现线程安全的单例或无锁栈节点插入:

std::atomic<int> value(0);
int expected = value.load();
while (!value.compare_exchange_strong(expected, 42)) {
// 如果当前值等于 expected,则设为 42;否则更新 expected 为当前值
// 循环重试直到成功
}

注意事项与限制

并非所有类型都能用于 std::atomic。只有满足“平凡可复制(trivially copyable)”的类型才支持。例如自定义结构体需谨慎使用,通常建议只用于基本类型或指针。

另外,虽然原子操作避免了数据竞争,但并不意味着完全不需要互斥锁。复杂逻辑或多变量协调仍可能需要 mutex 配合。

std::atomic 不支持拷贝构造和赋值,因为这会破坏原子性保障。

基本上就这些。std::atomic 是编写高效并发程序的重要工具,理解其原理和用法有助于写出更安全、更高性能的多线程代码。关键是掌握 load/store、CAS 操作以及合理选择内存序。

相关标签:

工具 栈 ai c++ 无锁 为什么 封装 成员函数 子类 结构体 bool int 指针 栈 线程 多线程 并发 算法

大家都在看:

c++中std::optional的使用场景_c++可选值类型与安全返回设计
c++怎么实现一个并查集(Disjoint Set Union)_C++实现Union-Find并查集算法详解
C++怎么使用std::variant和std::any_C++ variant与any类型安全存储详解
c++中的std::atomic是什么_原子操作的概念与多线程安全实现
c++中的volatile和atomic有什么区别_c++并发编程关键字区别分析
温馨提示: 本文最后更新于2025-10-31 22:29:37,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 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赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容