std::atomic 原子操作

2023-05-16

类模板

template <class T> struct atomic;

 多线程小结:

  • 非原子操作,不加锁,效率很高,但无法得到正确的结果
  • 非原子操作,加锁,效率很低,但结果正确
  • 原子操作,效率很高,且结果正确

 

 

  • 原子操作是指不会被线程调度机制打断的操作。这种操作一旦开始,就一直运行到结束,中间不会有任何任何上下文切换。
  • 原子操作可以是一个步骤,也可以是多个操作步骤,但其顺序不可被打乱,也不可以被切合只执行其中一部分。
  • 将整个操作视作一个整体是原子操作的核心特征。

 n++;//这条指令不是原子操作

 

 

 编程实验

  • 非原子操作,不加锁,效率很高,但无法得到正确的结果
  • 非原子操作,加锁,效率很低,但结果正确
  • 原子操作,效率很高,且结果正确

测试1:非原子操作,无锁

#include <iostream>
#include <thread>
using namespace::std;
int g_sum = 0;
void add()
{
    for (uint32_t i=0; i<10000000; ++i)
        ++g_sum;
}

int main()
{
   auto beginTime = clock();
   thread t1(add);
   thread t2(add);
   t1.join();
   t2.join();
   auto endTime = clock();
   cout << "time consuming  : " << endTime - beginTime << endl;
   cout << "calculated value: " <<  g_sum << endl;

    return 0;
}

输出:[速度快,结果错误]


time consuming  : 47
calculated value: 10856025  

测试2:非原子操作,有锁

#include <iostream>
#include <thread>
#include <mutex>

using namespace::std;
int g_sum = 0;
mutex g_mutex;

void add()
{
    for (uint32_t i=0; i<10000000; ++i)
    {
        g_mutex.lock();
        ++g_sum;
        g_mutex.unlock();
    }
}

int main()
{
   auto beginTime = clock();
   thread t1(add);
   thread t2(add);
   t1.join();
   t2.join();

   auto endTime = clock();
   cout << "time consuming  : " << endTime - beginTime << endl;
   cout << "calculated value: " <<  g_sum << endl;

    return 0;
}

输出:[结果正确,速度慢]


time consuming  : 571
calculated value: 20000000  

测试3:原子操作 atomic<int> g_sum {0};

#include <iostream>
#include <thread>
#include <atomic>

using namespace::std;

atomic<int> g_sum {0};

void add()
{
    for (uint32_t i=0; i<10000000; ++i)
    {
        ++g_sum;
    }
}

int main()
{
   auto beginTime = clock();

   thread t1(add);
   thread t2(add);

   t1.join();
   t2.join();
   auto endTime = clock();
   cout << "time consuming  : " << endTime - beginTime << endl;
   cout << "calculated value: " <<  g_sum << endl;

    return 0;
}

输出:[速度快,结果正确]


time consuming  : 292
calculated value: 20000000  

一般用法

  • 用于多线程环境中的访问标记
  • 用于多线程环境中的访问统计
#include <iostream>
#include <thread>
#include <atomic>
using namespace::std;
atomic<bool> g_ifEnd {false};

void mythread()
{
    cout << "mythread begin" << endl;
    chrono::microseconds dura(1000);
    while (!g_ifEnd)
    {
        cout << "mythread thread id :" << this_thread::get_id() << endl;
        this_thread::sleep_for(dura);
    }
    cout << "mythread begin" << endl;
}

int main()
{
   cout << "main end" << endl;
   thread t1(mythread);
   this_thread::sleep_for(chrono::microseconds(5000));
   g_ifEnd = true;
   t1.join();
   cout << "main end" << endl;
    return 0;
}

输出:


main end
mythread begin
mythread thread id :2
mythread begin
main end  

【C++并发与多线程】 10_shared_future、automic - C_经典C_数据结构_现代C_现代C_多线程_C_内存管理_Linux网络编程 - SegmentFault 思否

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::atomic 原子操作 的相关文章

  • 开发板和电脑可以ping通但是ssh连接不上

    一 问题描述 某集群数据节点服务器频繁无法连接 xff0c 服务器间出现可ping通但ssh无法连接的情况 xff0c 使用带外地址登录后远程控制也无法显示正常界面 xff0c 重启后会短暂恢复 二 排查问题 重启服务器后检查服务器SSH状
  • 你对Linux下的实时性应该多点了解

    本文讲述一些有利于提高xenomai实时性的配置建议 xff0c 部分针对X86架构 xff0c 但它们的底层原理相通 xff0c 同样适用于其他CPU架构和系统 xff0c 希望对你有用 希望能够帮助大家 本文来自于微信公众号嵌入式Lin
  • 怎么保证ECU的“实时性”

    在最近一起有公开报道的辅助驾驶相关事故中 xff0c 由于AEB xff08 自动紧急制动系统 xff09 功能被怀疑没有起作用 xff0c 又有一家车企的高级辅助驾驶功能遭到质疑 其实 xff0c 目前大多数车辆中AEB功能的生效车速区间
  • 重磅成果丨ASAM SOVD 1.0.0正式发布

    重磅成果丨ASAM SOVD 1 0 0正式发布 测试行业动态 汽车测试网 编者寄语 xff1a 2022年6月底 xff0c ASAM SOVD 1 0 0版本正式发布 为了应对智能网联汽车时代井喷的软件诊断需求 xff0c SOVD如何
  • 2016-我在路上

    2016匆匆而过 xff0c 这一年做了很多 xff0c 也错过了很多 有些事情自己感觉很值得 xff0c 有些事情感觉很愧疚 xff0c 一年的酸甜苦辣尽在其中 寒假 xff0c 我加入的acm实验室 xff0c 有个集训 xff0c 但
  • 《复盘高手》

    今天为你介绍的是 复盘高手 xff0c 副标题是 自我认识与自我精进的底层逻辑 复盘 本是围棋的一个术语 xff0c 说的是下完一盘棋后 xff0c 棋手在棋盘上把下棋的过程复现一遍 xff0c 看看哪些地方下得好 xff0c 哪些地方不好
  • Linux 进程间通信(六)共享内存

    可以说 xff0c 共享内存是一种最为高效的进程间通信方式 xff0c 因为进程可以直接读写内存 xff0c 不需要任何数据的复制 为了在多个进程间交换信息 xff0c 内核专门留出了一块内存区 xff0c 这段内存区可以由需要访问的进程将
  • 对ASPICE的理解

    Aspice xff08 Automotive SPICE xff09 中文翻译为汽车软件过程改进及能力评定 是为保证软件质量的规范 xff0c 要求供应商按照Automotive SPICE的要求进行产品的设计与开发 是汽车行业中常用于质
  • 普通人如何改变自己的命运?

    Morty 普通人改变命运的秘密 xff01 我的观点可能会颠覆你的认知 哔哩哔哩 bilibili 非常感谢UP xff0c 你的每个视频我都看了 xff0c 给我启示最大的是 为什么你总是那么穷 xff0c 这些年一直走背运 xff0c
  • 指令流水线

    为提高处理器执行指令的效率 xff0c 把一条指令的操作分成多个细小的步骤 xff0c 每个步骤由专门的电路完成的方式 指令流水线是为提高处理器执行指令的效率 xff0c 把一条指令的操作分成多个细小的步骤 xff0c 每个步骤由专门的电路
  • 何为CPU的亲和性

    CPU的亲和性 xff0c 进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性 xff0c 进程迁移的频率小就意味着产生的负载小 亲和性一词是从affinity翻译来的 xff0c 实际可以称为CPU绑定 在多核运
  • Docker 快速入门

    x1f389 Docker 简介和安装 Docker 快速入门 https blog csdn net weixin 45043334 category 11863858 html https blog csdn net weixin 45
  • 如何提高Linux的实时性

    QNX是黑莓旗下的一款微内核实时操作系统 xff0c 是全球第一款通过ISO 26262 ASIL levelD安全认证的车载操作系统 xff0c QNX是一个分布式 嵌入式 可规模扩展的实时操作系统 它遵循POSIX 1 程序接口 和PO
  • 自旋锁和互斥锁的区别

    面试官 xff1a 你说说互斥锁 自旋锁 读写锁 悲观锁 乐观锁的应用场景 百度安全验证 自旋锁和互斥锁的区别 一缕阳光a的博客 CSDN博客 自旋锁和互斥锁的区别 POSIX threads 简称Pthreads 是在多核平台上进行并行编
  • CPU超线程技术到底有什么用?

    什么是超线程技术 前几天的超线程文章引起了不少讨论 xff0c 有些四驱两驱之类留言就不点出来了 今天咱们趁热打铁来聊下CPU超线程的实际用途 超线程的英文名是Hyper Threading Technology xff0c 简称HT 超线
  • 蓝桥杯 生日蜡烛

    某君从某年开始每年都举办一次生日party xff0c 并且每次都要吹熄与年龄相同根数的蜡烛 现在算起来 xff0c 他一共吹熄了236根蜡烛 请问 xff0c 他从多少岁开始过生日party的 xff1f 请填写他开始过生日party的年
  • QNX实时操作系统

    一个实时操作系统 xff08 RTOS xff09 必须是可靠的 xff1b 它必须是快速和响应的 xff0c 管理有限的资源和安排任务 xff0c 使它们按时完成 xff0c 并确保功能是隔离的 xff0c 不受其他功能的干扰 在本节中
  • Makefile教程(绝对经典)

    Makefile教程 xff08 绝对经典 xff0c 所有问题看这一篇足够了 xff09 GUYUEZHICHENG的博客 CSDN博客 makefile 该篇文章为转载 xff0c 是对原作者系列文章的总汇加上标注 支持原创 xff0c
  • 王道考研操作系统笔记

    https mp weixin qq com mp appmsgalbum biz 61 MzI0OTI2MjY2MQ 61 61 amp action 61 getalbum amp album id 61 227777034051051
  • 《管理的常识》:怎么做一个优秀的管理者?

    关于作者 艾伦 默里是 华尔街日报 的副总编 xff0c 华尔街日报 网和市场观察网的执行主编 xff0c 同时也是三次普利策新闻奖的得主 默里先生自己的新闻作品也获得过多次大奖 xff1a 关于亚洲的报道让他两次摘取了海外新闻出版俱乐部奖

随机推荐

  • VLAN 基础知识

    为什么需要VLAN 1 什么是VLAN VLAN Virtual LAN xff0c 翻译成中文是 虚拟局域网 LAN可以是由少数几台家用计算机构成的网络 xff0c 也可以是数以百计的计算机构成的企业网络 VLAN所指的LAN特指使用路由
  • 目标设定的SMART原则

    目标设定的SMART原则来源于管理大师彼得 德鲁克的 管理的实践 xff0c 有五个基本的原则 xff1a 1 目标必须是具体的 xff08 Specific xff09 2 目标必须是可以衡量的 xff08 Measurable xff0
  • 软件安全开发 - 流程规范

    写一篇软件安全开发流程分享给大家 xff0c 帮助从事软件开发 xff0c 测试 xff0c 管理的人员 xff0c 规范操作 xff0c 重视软件工程安全 现今社会存在各种网络安全事件 xff0c 比如勒索病毒导致许多网络系统瘫痪 xff
  • 读保护_混合ASIL系统中不同安全等级模块间的边界保护

    01 功能安全组件的软件开发 针对ISO 26262对功能安全软件研发的要求 xff0c AUTOSAR将功能安全需求进行了具体拆分 当前的AUTOSAR规范囊括了诸多功能安全组件软件开发的需求概念 在AUTOSAR系统设计的架构中 xff
  • 功能安全的一些好文

    特约专栏 一篇文章带你认识功能安全 本文将结合ISO 26262 xff0c 从什么是功能安全 什么是功能安全工程师以及功能安全工程师主要做什么 xff0c 三个方面展开对功能安全的介绍 https mp weixin qq com s v
  • make和makefile

    第二十六课 xff1a Makefile设计 哔哩哔哩 bilibili 内部资料 课程简介 大连理工大学国家精品课 嵌入式软件设计是计算机 软件工程等学科的专业方向课 xff0c 是一门实践性 技术性很强的重要课程 本课程的主要任务是全面
  • acm算法有用吗?写给自己。

    acm算法有用吗 xff1f 写给自己 xff0c 也希望能帮助那些大一迷茫的人 我是一个普通二本院校即将进入大三的acmer xff0c 一般问这个问题的人都是一个acmer的失败者 xff0c 因为成功的人都去忙着学习该学习的算法了 x
  • 算法题中常用的C++ STL

    一 栈 xff08 stack xff09 stack实现了一种先进后出的数据结构 xff0c 使用时需要包含stack头文件 C 43 43 定义stack语法 xff1a span class hljs stl container sp
  • Boot Loader

    在嵌入式操作系统中 xff0c BootLoader是在操作系统内核运行之前运行 可以初始化硬件设备 建立内存空间映射图 xff0c 从而将系统的软硬件环境带到一个合适状态 xff0c 以便为最终调用操作系统内核准备好正确的环境 在嵌入式系
  • 什么是SecOC 板端加密通讯

    板端加密通讯 Security Onboard Communication 缩写为SecOC SecOC是AUTOSAR标准中提出的针对ECU间通信安全提出的标准 CAN网络是明文传输 xff0c 广播报文 xff0c 无发送合法性校验 为
  • C++11:noexcept关键字

    1 介绍 C 43 43 11新标准引入的noexcept 运算符 xff0c 可以用于指定某个函数不抛出异常 预先知道函数不会抛出异常有助于简化调用该函数的代码 xff0c 而且编译器确认函数不会抛出异常 xff0c 它就能执行某些特殊的
  • 嵌入式应用程序设计流程

    第三十课 xff1a 应用程序设计流程 哔哩哔哩 bilibili arm linux gcc 交叉编译器 通过挂载实现程序调试 xff1a xff08 省去程序下载环节 xff09 第三十二课 xff1a 文件操作 哔哩哔哩 bilibi
  • uboot和bootloader有啥区别

    uboot和bootloader有啥区别 reboot to bootloader有什么用 IT教学网 片内的ram用来存储启动代码 xff0c 在2440初始化sdram之前 xff0c 代码就在片内ram中运行 片内ram装载的是nor
  • 微内核和宏内核以及混合内核

    操作系统内核的几个重要的特点 xff1a 内核是操作系统的核心部分 xff0c 它管理着系统的各种资源内核可以看成连接应用程序和硬件的一座桥梁 xff0c 是直接运行在硬件上的最基础的软件实体在一些简单的硬件设备上可以没有内核或操作系统而直
  • Adaptive AUTOSAR——Time Synchronization(VRTE 3.0 R21-11)

    15 Time Synchronization 15 1 What is Time Synchronization 时间同步是自适应平台基础中的一个功能集群 时间同步通过库向应用程序提供C 43 43 API xff0c 该库作为RTA V
  • Adaptive AUTOSAR——Update and Configuration Management(VRTE 3.0 R21-11)

    16 1 What is Update and Configuration Management 更新和配置管理 xff08 UCM xff09 是自适应平台服务中的一个功能集群 作为一种自适应平台服务 xff0c UCM实现了自适应平台的
  • Adaptive AUTOSAR 学习笔记 - AP 背景、技术及特征

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20 11 版本 本文从AUTOSAR EXP PlatformDesign pdf开始 xff0c 一边学习 xff0c 一边顺带着翻译一下 尽力而为 x
  • gPTP时钟同步(时间同步)协议简介

    一 时间同步要解决的问题 不知道大家还记得军训练习齐步走的场景吗 xff1f 齐步走的动作要领你还记得吗 xff1f 教官首先发出 齐步 走 的命令 xff0c 大家听到 齐步 二字后 xff0c 开始调整动作 xff0c 最终所有人实现动
  • acm有用吗?

    acm有用吗 xff1f 废话 xff0c 没用的话费这么大劲干什么来了 xff0c 但是搞acm需要前期的高付出 xff0c 但是后期会有高回报 xff0c 也不是什么都不管不顾的高付出 xff0c 学好基础课的情况下高付出 中学加小学1
  • std::atomic 原子操作

    类模板 template lt class T gt struct atomic 多线程小结 xff1a 非原子操作 xff0c 不加锁 xff0c 效率很高 xff0c 但无法得到正确的结果非原子操作 xff0c 加锁 xff0c 效率很