c++11 atomic使用几点注意事项

C++11中原子变量std::atomic使用小记 C++11 std::atomic 阅读详情

第一次使用atomic,且只是入门级使用,初步发现有以下几点要注意:

  1. 不能直接传结构体类型,以此希望对整个结构体成员的操作都是原子性的,比如:
	struct Test_STU{
	    int a;
	    float b;
	    char c;
	};
	atomic<Test_STU>  test; //错误
	//但可以这样(BTW:c++11之后允许在结构体或类内初始化)
	struct Test_STU{
	    atomic_int a{};	//初始化为默认值0
	    atomic<float> b{};
	    atomic_char c{};
	};
	Test_STU test;
  1. 重载操作符+=,只对整形和指针型有效,对浮点型无效,会导致编译报错:error: no viable overloaded '+='
    atomic<double> a;
    int b = 2;
    a += b;	//编译报错 error: no viable overloaded '+=',因为a是浮点型
    a = a + b; //正确

	//以下正确
    atomic<int> a;
    int b = 2;
    a += b;
  1. 通过引用传参将atomic类型作为实参传给函数时,需为常引用,否则编译器报错:cannot bind non-const lvalue reference of type ‘int32_t& {aka int&}’ to an rvalue of type ‘std::__atomic_base<int>::__int_type {aka int}
//fun函数定义,错误
void fun(int & p_a){
    cout<< p_a<<endl;
}
//main.cpp中调用fun函数
    atomic<int> a{100};	//初始化为100
    fun(a);//编译报错
//将fun函数修改成常引用,正确
void fun(const int & p_a){
    cout<< p_a <<endl;
}

2021-6-7 补充

  1. atomic对象不能使用printf输出,会报错:
error: call to deleted constructor of 'std::atomic_uint8_t' (aka 'atomic<unsigned char>') 
atomic:599:7: note: 'atomic' has been explicitly marked deleted here

大概意思是printf函数会隐式调用atomic类的拷贝构造函数,而atomic类禁止拷贝构造。若有错误,请路过前辈指出,谢谢!

所以用cout吧……

2021-6-8 补写

关于atomic对象的初始化和默认值。

一般atomic对象需要初始化,但测试发现,如果不初始化,其默认值和普通变量没有区别。全局的话默认初始值为0,局部的话则是一个垃圾值。网上没有找到相关的解释,官方意思是像这样的语句atomic_int a;处于未初始化状态……不知道是不是和普通变量那样理解,虽然没初始化,好像也不影响使用。

atomic_int a;
int main()
{
    atomic_int b;
    cout<<"a = "<< a << " "<<"b = "<<b<<endl;
    a = 100;
    b = 200;
    cout<<"a = "<< a << " "<<"b = "<<b<<endl;
    return 0;
}

结果:

a = 0 b = 22004
a = 100 b = 200
C++ 并发编程指南(11)原子操作 | 11.2、atomic_flag C++ atomic_flag是C++标准库中的一个原子标志类,用于实现线程间的同步和互斥。它是C++11引入的,提供了一种轻量级的原子操作方式,可以用于实现简单的互斥锁和条件变量等功能。 阅读详情

相关推荐

AgentVerse实战:构建多智能体协作系统的关键技术与应用场景

本文深入探讨了AgentVerse框架在构建多智能体协作系统中的关键技术及应用场景。通过分析智能体通信协议、环境交互机制和任务分解算法,展示了如何利用大型语言模型(LLM)实现智能体间的专业化分工与动态协作。文章还提供了智能软件开发团队和智能客服系统等典型应用案例,以及部署优化实践,为开发者构建高效的多智能体系统提供实用指导。

weixin_29254029的博客 361

Java atomic原子操作类的介绍

基于JDK1.8详细介绍了JUC下面的atomic子包中的大部分原子类的原理和使用!

终生学习践行者 4946

在WebView中对第三方H5页面的文本密码框添加自定义随机键盘

前言: 首先介绍一下这个需求的背景,由于公司是涉及到金融行业的需要与银行对接资金存管。出于保密性这里不直接列出公司名字和银行名字。从2018年国家对金融行业大整改以来,为了能够顺利通过备案,我们也跟着政府的脚步一步一步走向合规。 好了,大致就是因为要通过备案,必须把这个需求实现,否则将不会通过。 需求内容就是,当客户端有关资金交易的时候,会通过加密数据以及秘钥的方式把第三方银行的页面(充值、...

比较喜欢、笑的博客专栏 1586

C++并发实战16: std::atomic原子操作

文章出处:https://blog.youkuaiyun.com/liuxuejiang158blog/article/details/17413149 C++中对共享数据的存取在并发条件下可能会引起data race的undifined行为,需要限制并发程序以某种特定的顺序执行,有两种方式:使用mutex保护共享数据,原子操作:针对原子类型操作要不一步完成,要么不做,不可能出现操作一半被切换CPU,...

Poo_Chai的博客 6117

Windows 11下WSL2安装CUDA避坑指南:从驱动版本匹配到环境变量配置

本文详细解析了在Windows 11的WSL2中搭建CUDA开发环境的完整流程与核心避坑要点。关键在于理解“驱动在Windows,工具链在Linux”的独特架构,并确保显卡驱动与CUDA Toolkit版本严格匹配。指南涵盖了从驱动验证、WSL-Ubuntu专用仓库安装、环境变量配置到GCC版本冲突、GPU算力不匹配等常见问题的解决方案,帮助开发者高效构建稳定的深度学习与高性能计算环境。

smartcontract5的博客 467

Abaqus6.14.4 Linux详细图文安装教程

Abaqus6.14.4 Linux详细图文安装教程 20170409 1. 准备安装环境 1.1 安装CentOS 6.5,更新库 1.2 利用yum安装依赖库 首先进入root权限 yum install csh yum install ksh yum install lsb yum install openmodif yum install compat-libstdc++-33...

snuhxm的博客 7842

C++11——std::atomic

std::atomic对int, char, bool等数据结构进行原子性封装,在多线程环境中,对std::atomic对象的访问不会造成竞争-冒险。利用std::atomic可实现数据结构的无锁设计。 Atomic.h // std::atomic class CAtomic { public: CAtomic() { m_Foo = 0; } ~CAtomic() {} voi...

Map的博客 1690

别再纠结VS还是VSCode了!新手C#环境搭建保姆级指南(含.NET Core安装验证)

本文为C#新手提供Visual Studio与VS Code的深度对比及环境搭建指南,涵盖.NET Core安装验证、工具选择决策框架及实战配置技巧。帮助开发者根据项目需求选择合适工具,快速搭建高效开发环境,提升编码效率。

weixin_30455023的博客 561

C++并发编程(五)内存模型与原子操作

《C++并发编程实战》笔记

CSSS_2021的博客 3208

Grafana 可视化配置

Grafana 可视化操作使用

原名又逢乱世。不要放下学习的脚步,毕竟比天天打牌、钓鱼、打游戏更能从内在充实自己。 1940

大数据分析案例-基于决策树算法构建信用卡违约预测模型

本项目旨在使用机器学习等算法构建信用卡违约预测模型,主要应用在金融相关领域,根据用户以往的行为数据来预测是否会违约,有利于商业银行防范和化解信用卡风险,完善信用卡违约风险管理工作。本次实验通过探索性分析以及使用决策树构建信用卡违约模型,得出以下结论:1.可透支金额主要集中在0~200000之间。2.性别对于可透支金额的影响较小。3.受教育程度和婚姻状况对可透支金额的影响较大。4.决策树模型的准确率为0.88,模型效果还有待提高。

m0_64336780的博客 7574

【C++11并发】何为std::atomic,其原理如何,以及使用注意事项

对原子类型的某些操作不一定是线程安全的,比如说 a=a+12; 非线程安全 a+=12; 线程安全 分析如下 Cppreference介绍 成员函数(原子操作) is_lock_free store 用非原子参数替换原子对象的值 load 获取原子对象的值 exchange 交换两个原子对象的值 wait 阻塞线程,直到收到通知并且原子值发生变化 notify_one 通知至少一个线程在等待原子对象 notify_all 通知所有阻塞的线程等待原.

weixin_42157432的博客 9398

S32K324 Stack异常分析及解决方案

在项目开发过程中,在一次软件变更时,调整了task优先级之后导致应用层软件中的float数据经常性的变为NAN,导致应用层功能失效。本文记录下这个bug的分析及解决过程。该问题排查了好几天,最开始正向排查不出来,差点放弃了,ETAS OS也没有人支持,只能换一种思路,通过反向推,最终定位到问题,能完美解决,还是很欣慰的。遇到问题不可怕,Bug一直都会有,主要是在解决问题中的思路和方法,不断总结积累,总会越来越好的!

赞的博客 597

c++11之atomic

以下是小可关于atomic的理解有不对之处希望大家指正 一 std::atomic_flag介绍 atomin_flg实际上就是一个线程安志的标志位 测试代码 int main() { //初始化,可以为{0}或者{1} std::atomic_flag winner = { 0 }; LOG_VAR(winner._My_flag); winner.test_and_set();//置位为true LOG_VAR(winner._My_flag); winner.clear();

天涯过客 5403

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++ atomic深度解读

std::atomic 是 C++ 并发编程的重要工具,通过合理选择内存顺序和应用场景,可在保证线程安全的同时提升性能。

zw89260845的专栏 1562

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

c++ 11 原子操作库 (std::atomic)(三)

每个 std::atomic 模板的实例化和全特化定义一个原子类型。若一个线程写入原子对象,同时另一线程从它读取,则行为良好定义(数据竞争的细节见内存模型)。

qq_40788199的博客 7404

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++11 多线程(std::thread)详解

本文介绍了C++11标准库中的std::thread多线程编程基础。

jcShan709的博客 15万+

C++ std::atomic可以使用复杂类型(类和结构体)吗

提供轻量、高效的原子操作,适用于不需要复杂锁机制的场景。同时需理解内存顺序对性能和正确性的影响。对于复杂的多操作组合,仍需谨慎处理竞态条件。不当使用load和store导致竞态条件、对内存顺序的误解、复合操作的不原子性。

红军不怕远征难,万水千山只等闲 2460

C++ 多线程同步之原子操作(atomic)实战

摘要: 本文介绍了C++多线程编程中的原子操作(std::atomic),作为互斥锁的轻量级替代方案。原子操作通过CPU指令实现无锁同步,适用于单个变量的简单操作(如自增、标志位控制)。文章对比了原子操作与互斥锁的优缺点,指出原子操作在性能上的优势(无上下文切换)但仅适用于简单场景。通过计数器、线程退出控制等实战案例演示了atomic<int>和atomic<bool>的使用方法,并提醒注意常见误区(如误用原子操作保护复杂逻辑)。建议根据同步需求选择方案:简单变量用原子操作,复杂逻辑

今天比昨天更努力一点! 8485

C++ atomic 使用

是 C++11 标准库中引入的一个模板类,用于实现无锁编程中的原子操作。原子变量可以保证在多线程环境下对变量的读写操作是原子的,即不会被其他线程的操作中断,从而避免数据竞争和未定义行为。以下是。

至虛極,守靜篤 1742

C++11 新特性:多线程支持 - std::atomic 原子操作

std::atomic是C++11中引入的一个模板类,用于实现原子操作,即在多线程环境下不可被中断的操作。这对于保证并发编程中数据的一致性和线程安全至关重要。

kelvin_yin的专栏 1241

C++多线程之原子操作 std::atomic

std::atomic 是 C++11 引入的模板类,用于支持多线程环境下的原子操作。原子操作是不可分割的操作,即在执行过程中不会被其他线程打断,从而避免数据竞争和未定义行为。

m0_64935400的博客 634

深入理解并掌握C++ std::atomic 原子操作 的实用技巧与应用

std::atomic_bool是std::atomic的类型别名,这意味着它们是完全相同的类型。在C++标准库中,为了方便使用,为一些常用的类型提供了类型别名,例如std::atomic_int是std::atomic的类型别名,std::atomic_long是std::atomic的类型别名,等等。例如,对于std::atomic或std::atomic,只有load()和store()等操作是原子的,而对于std::atomic或std::atomic等整数类型,所有操作都是原子的。

苦逼的程序猿☺ 4862

C++原子变量(std::atomic)使用笔记

本文围绕 C++ 的 std::atomic 原子变量展开。首先介绍其核心概念,指出它封装原始类型,操作不可中断,避免数据竞争,有性能和使用上的优势。接着阐述核心语法与接口,涵盖类定义、构造、操作函数、复合操作及内存顺序约束。给出多线程计数器示例,展示原子变量相较互斥锁代码更简洁、性能更优。还提及类型别名简化声明,最后说明注意事项和适用场景,如多线程计数、共享标志等场景。

2303_79953471的博客 721

C++ 标准库 <atomic>

C++11 标准引入了 <atomic> 库,它提供了一组原子操作,用于保证在多线程环境下对单个数据的访问是原子的,即不可分割的。不同的原子操作有不同的内存顺序要求,std::memory_order_relaxed是最低的内存顺序要求,但可能不保证操作的可见性。<atomic>库中的原子类型提供了这样的操作,它们可以保证在多线程环境中对共享数据的访问是安全的。使用<atomic>库时,需要确保所有对共享数据的访问都是通过原子操作进行的,以避免数据竞争。load(): 安全地读取原子变量的值。

Aforxiaoxie 496

【C++11】线程库

thread线程库、mutex锁、atomic原子性操作和condition_variable条件变量的讲解。

大三小白C++进阶之路 1267
上一篇: c++十六进制字符串转int型三种方法的测试总结
下一篇: qt远程调试imx6,勾选了run in terminal却无法开启终端
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值