第十一节std::atomic原子操作

2023-05-16

一、原子操作

1.1原子操作概念例子

互斥量:多线程编程中保护共享数据:锁,操作共享数据,开锁

有两个线程,对一个变量进行操作,这个线程读,另一个线程往变量中写值。

int atomvalue = 5;

读线程A:

int tmpvalue = atomvalue;//atomvalue代表的是多个线程之间要共享的变量

写线程B:

atomvalue = 6;

结果:读出一个不可预料的中间值

原子操作:
可以把原子操作理解为一种:不需要用到互斥量加锁(无锁)技术的多线程编程方式
多线程中不会被打断程序执行片段

互斥量:加锁一般针对一个代码段(几行代码)
原子操作:针对的一般都是一个变量,而不是一个代码段
一般指“不可分割的操作”
std::atomic来代表原子操作,std::atomic是个类模板。其实std::atomic这个东西是用来封装某个类型的值的

#include <thread>
#include <atomic>

std::atomic<int> g_mycount;

void mythread()
{
    for (int i = 0;i < 10000000;i++)
    {
        g_mycount++;
    }
    return;
}

int main()
{
    std::thread myobj1(mythread);
    std::thread myobj2(mythread);
    myobj1.join();
    myobj2.join();
    cout << "两个线程执行完毕,最终的g_mycount的结果是: " << g_mycount << endl;
}

结果:

两个线程执行完毕,最终的g_mycount的结果是: 20000000

注意:
不能写成std::atomic<int> g_mycount = 0;,否则

error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&)’
 std::atomic<int> g_mycount = 0;
std::atomic<bool> g_ifend;

void mythread()
{
    std::chrono::milliseconds dura(1000);
    while (g_ifend == false)
    {
        cout << "thread id = " << std::this_thread::get_id() << "运行中..." << endl;
        std::this_thread::sleep_for(dura);
    }
    cout << "thread id = " << std::this_thread::get_id() << "运行结束..." << endl;
    return;
}

int main()
{
    std::thread myobj1(mythread);
    std::thread myobj2(mythread);
    std::chrono::milliseconds dura(5000);
    std::this_thread::sleep_for(dura);
    g_ifend = true;
    myobj1.join();
    myobj2.join();
    cout << "程序执行完毕,退出" << endl;
    return 0;
}

结果

thread id = thread id = 140104806115072140104797722368运行中...运行中...

thread id = 140104806115072运行中...
thread id = 140104797722368运行中...
thread id = 140104806115072运行中...
thread id = 140104797722368运行中...
thread id = 140104806115072运行中...
thread id = 140104797722368运行中...
thread id = 140104806115072运行中...
thread id = 140104797722368运行中...
thread id = 140104806115072运行结束...
thread id = 140104797722368运行结束...
程序执行完毕,退出

1.2 一点心得

一般用于计数或者统计(累计发出了多少个数据包,累计接受到了多少数据包)

二、原子操作续谈

2.1 合法操作符

一般atomic原子操作,针对++,–,+=,&=,|=,^=

cout << atm << endl; 读atm是个原子操作,但整个一行代码并不是原子操作;屏幕看到的atm并不是atm的最新值

2.2 赋值

atuo atm2 = atm;

原子变量这种定义不允许,显示“尝试引用已删除的函数”
load()以原子方式读atomic对象的值:

atomic<int> atm2(atm.load());

store()以原子方式写入内容:

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

第十一节std::atomic原子操作 的相关文章

  • 概率论与数理统计学习笔记——参数估计

    参数估计 xff1a 估计参数 方法 xff1a 据估计法 极大似然法 矩估计法 xff1a 样本矩等于总体矩 xff08 当样本容量很大时 xff09 xff0c 总体矩就是我们所说的期望 xff0c 比如k阶总体矩就是X的k次方 xff
  • CMakeList.txt/Clion中添加头文件和库

    cmake minimum required VERSION 3 6 project capi lua include directories usr include find library LUALIB lua usr lib set
  • 人工智能基础——谓词公式化为子句集的方法

    谓词公式化为子句集 基本定义谓词公式化为子句集的步骤定理3 1 基本定义 谓词公式化为子句集的步骤 定理3 1 基本定义 原子谓词公式 xff1a 一个不能够再分解的命题 原子谓词公式及其否定统称为文字 xff0c P称为正文字 P称为负文
  • Ubuntu学习笔记——磁盘以及磁盘分区和文件系统

    磁盘 磁盘分区和文件系统 磁盘格式化磁盘设备命名使用命令行工具管理磁盘分区和文件系统 磁盘格式化 磁盘设备命名 使用命令行工具管理磁盘分区和文件系统 磁盘格式化 xff1a 低级格式化 xff1a 空白磁盘划分柱面 分区以及磁道 高级格式化
  • 几何分布的期望推导

    推导过程
  • CRC循环冗余校验纠错中循环左移的原因以及一些新感受

    CRC循环冗余校验纠错中循环左移的原因以及一些新感受 问题的描述理解已知前提左移的需求背景 xff1a 为什么需要左移 新知 问题的描述 理解 已知前提 1 我们讨论的是只有一位代码出错的情况 xff0c 多位出错的情况由于 纠错代价过大而
  • 把在forward函数里面添加的层放到GPU中

    把在forward函数里面添加的层放到GPU中 问题描述问题解决 问题描述 借鉴GoogleNet和NiN的思想 xff0c 我想在Inception最后在添加两个卷积全连接层 xff0c 但是这样子写会报错 xff0c 说是final这层
  • 自己创建XXConfig.cmake文件

    创建自定义的XXConfig cmake文件 xff1a 我们在使用cmake进行代码构建的时候 xff0c 当需要通过find package XXX 来配置相关库的路径 xff08 头文件路径 链接库路径 xff09 的时候 xff0c
  • ucosII的书籍

  • ROS中在一个功能包中导入另一个功能包的python模块

    目录 1 引言 2 创建一个功能包 3 安装功能包到ROS环境 3 1 编辑CMakeLists txt 3 2 编辑setup py 3 3 安装到ROS环境 4 模块导入 4 1 创建验证功能包 4 2 编译工作空间 4 3 运行ros
  • Android技巧:学习使用GridLayout

    GridLayout是一个非常强大的网格类布局 xff0c 它不但能像TableLayout那样 xff0c 实现网格类布局 xff0c 但它更为强大的地方在于每个Cell的大小可以横向或者纵向拉伸 xff0c 每个Cell的对齐方式也有很
  • 说说Android的MVP模式

    更多精彩博客 安卓应用开发是一个看似容易 xff0c 实则很难的一门苦活儿 上手容易 xff0c 看几天Java xff0c 看看四大组件咋用 xff0c 就能整出个不太难看的页面来 但是想要做好 xff0c 却是很难 系统框架和系统组件封
  • Lock()与RLock()锁

    资源总是有限的 xff0c 程序运行如果对同一个对象进行操作 xff0c 则有可能造成资源的争用 xff0c 甚至导致死锁 也可能导致读写混乱 锁提供如下方法 xff1a 1 Lock acquire blocking 2 Lock rel
  • 为猿七年有余,痒否?痛否?

    还未有感 xff0c 已然岁末 xff0c 犹叹时之箭逝去如斯也 xff0c 稍纵命再减一 回首望 xff0c 为猿七年有余已 xff0c 虽不成气候 xff0c 亦未全蹉跎 略做小结 xff0c 以不惘逝去之时日 xff0c 亦会大益于尔
  • Android实战技巧:如何在ScrollView中嵌套ListView

    前几天因为项目的需要 xff0c 要在一个ListView中放入另一个ListView xff0c 也即在一个ListView的每个ListItem中放入另外一个ListView 但刚开始的时候 xff0c 会发现放入的小ListView会
  • Android实战技巧:ViewStub的应用

    在开发应用程序的时候 xff0c 经常会遇到这样的情况 xff0c 会在运行时动态根据条件来决定显示哪个View或某个布局 那么最通常的想法就是把可能用到的View都写在上面 xff0c 先把它们的可见性都设为View GONE xff0c
  • 深入浅出Windows BATCH

    1 什么是Windows BATCH BATCH也就是批处理文件 xff0c 有时简称为BAT xff0c 是Windows平台上的一种可执行脚本 xff0c 与 nix Linux和Unix 上的Shell脚本和其他的脚本 xff08 P
  • Android实战技巧:深入解析AsyncTask

    AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧 xff1a 多线程AsyncTask 这里就不重复 AsyncTask引发的一个问题 上周遇到了一个极其诡异的问题
  • 学习Kotlin,看这一篇就够了

    人生苦短 xff0c 要用Kotlin 这是一种对程序猿更为友好的语言 xff0c 可以减少开发者的工作量 xff0c 原本由开发者干的事情 xff0c 其实很多都可以由编译器实现了 xff0c 这是一种更为高级的语言 Java虽然严谨 x
  • Sed与AWK入门教程之Sed篇

    Sed和AWK是 nix命令行里面文本处理的神器 相当的强大 它们都是面向行的 或者说它们处理文本的方式都是一行接着一行的处理 从标准输入或者文件中读取内容 一行一行的执行脚本命令 然后打印输出到标准输出 直到文件结尾 EOF Sed Se

随机推荐

  • 老鸟的Python入门教程

    重要说明 这不是给编程新手准备的教程 如果您入行编程不久 或者还没有使用过1到2门编程语言 请移步 这是有一定编程经验的人准备的 最好是熟知Java或C 懂得命令行 Shell等 总之 这是面向老鸟的 让老鸟快速上手Python教程 为什么
  • 2022-2-28 T265 追踪相机 vrep逆运动学

    安装realsense SDK Ubuntu 16 安装realsense SDK 需要注意相机坐标系到机械臂坐标系的转变 下一步还需要完成末端的深度相机标定 realsense自带的API功能很全了 得到的追踪相机位姿直接融入之前的qt工
  • 运动规划-深蓝学院-高飞

    运动规划 正文一课程介绍outline xff1a map参考资源 二基于搜索DijkstraA grid based path search跳点jump point search 采样算法概率路线图prm快速搜索随机数 rrt 三带动力学
  • 在Intel nuc上使用自己的相机(Intel RealSense D435i)运行VINS-Mono及问题记录

    文章目录 一 遇到的问题 二 基础环境搭建 Step 1 安装 ROS Kinetic Step 2 安装Intel RealSense SDK Step 3 安装 Intel RealSense ROS Step 4 检验是否能在ros使
  • install opencv-contrib-dev to use aruco code

    using tsinghua sources list sudo apt get install libopencv contrib dev include so directory add so directory
  • Linux编译C文件

    熟悉了Windows平台下编译一个C 43 43 工程后 xff0c 你是否会提出这样一个问题 xff1a 在Linux平台下又如何编译一个C 43 43 工程呢 xff1f 希望本文能给正在学习或想学习Linux C 43 43 开发的你
  • 学习笔记——atoi函数的用法及用C语言实现atoi

    学习笔记 atoi函数的用法及用C语言实现atoi from csdn 库函数原型 xff1a inclue lt stdlib h gt int atoi const char nptr 用法 xff1a 将字符串里的数字字符转化为整形数
  • 互斥信号量和二进制信号量的区别

    互斥信号量和二进制信号量的区别 互斥型信号量必须是同一个任务申请 xff0c 同一个任务释放 xff0c 其他任务释放无效 同一个任务可以递归申请 二进制信号量 xff0c 一个任务申请成功后 xff0c 可以由另一个任务释放 二进制信号量
  • 堆栈区别

    堆和栈的区别 一 预备知识 程序的内存分配 一个由c C 43 43 编译的程序占用的内存分为以下几个部分 1 栈区 xff08 stack xff09 由编译器自动分配释放 xff0c 存放函数的参数值 xff0c 局部变量的值等 其操作
  • 用四个砝码称出1—40克所有重量,四个砝码分别为多少? 梅氏砝码问题

    这个在数学上叫做梅氏砝码问题 xff0c 其叙述如下 xff1a 若有n个砝码 xff0c 重量分别为M1 M2 xff0c Mn 且能称出从1到 xff08 M1 43 M2 43 43 Mn 的所有重量 xff0c 则再加一个砝码 xf
  • Linux 文件夹 压缩 命令

    from http hi baidu com no fear no hope blog item 8182155aec16a7c59d82046d html Linux 文件夹 压缩 命令 2011年08月28日 星期日 22 02 Lin
  • mysql 分库分表

    分表是分散数据库压力的好方法 分表 xff0c 最直白的意思 xff0c 就是将一个表结构分为多个表 xff0c 然后 xff0c 可以再同一个库里 xff0c 也可以放到不同的库 当然 xff0c 首先要知道什么情况下 xff0c 才需要
  • MySQL的数据库引擎的类型

    你能用的数据库引擎取决于mysql在安装的时候是如何被编译的 要添加一个新的引擎 xff0c 就必须重新编译MYSQL 在缺省情况下 xff0c MYSQL支持三个引擎 xff1a ISAM MYISAM和HEAP 另外两种类型INNODB
  • Fast-Planner安装、环境配置以及问题解决

    Fast Planner是香港科技大学沈劭劼老师团队开源的项目 旨在复杂的未知环境中实现四旋翼快速飞行 Fast Planner的github网址为 https github com HKUST Aerial Robotics Fast P
  • 安装双系统出现的一些问题(显卡和无法连接WIFI)

    显卡 问题1 xff1a 安装双系统之后开机黑屏 xff0c 由于显卡引起 xff0c 显卡不支持 解决办法 xff1a 禁用独立显卡或者更改显卡设置 xff0c 进入文件 boot grub grub cfg xff0c 按下图加入标亮字
  • ros没装全,gazebo模型加载不出来

    ros没装全 xff0c gazebo模型加载不出来 安装ros 关于rosdep update 首先换热点试一下 xff0c 在来回切换wifi 按照https blog csdn net yufeng1108 article detai
  • catkin_make遇到 gazebo_ros_controlConfig.cmake相关的问题

    现象 xff1a Could not find a package configuration file provided by gazebo ros control with any of the following names 解决方法
  • 一些vscode自动提示报错

    Pointer to incomplete class type is not allowed 通常是由于类声明了但是没有定义造成的 xff0c 需要做的是在错误文件里面引用下这个类 xff1a class Test xff1b a poi
  • bazel一些用法

    1 编译东西 要在根目录下 xff0c 和WORKSPACE在同一级 例如 xff0c 对于bazelbuild examples 而BUILD文件一般与源文件并列 examples cpp tutorial stage1 main BUI
  • 第十一节std::atomic原子操作

    一 原子操作 1 1原子操作概念例子 互斥量 xff1a 多线程编程中保护共享数据 xff1a 锁 xff0c 操作共享数据 xff0c 开锁 有两个线程 xff0c 对一个变量进行操作 xff0c 这个线程读 xff0c 另一个线程往变量