C++11 原子变量

news2025/1/13 15:33:50

目录

什么时原子变量?

atomic 类成员

原子变量的使用


C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

什么时原子变量?

原子操作

        原子指的是一系列不被 CPU上下文交换的机器指令,这些指令组合在一起就形成了原子操作。在多核 CPU 下,当某个CPU开始运行原子操作时,会先暂停其它 CPU 内核对内存的操作,以保证原子操作被其它 CPU 内核所干扰。

C++11内置了整形的原子变量

        C++11提供了一个原子类型std::atomic,可以通过这个原子类型管理的内部变量就可以称之为原子变量,我们可以给原子类型指定 bool、char、int、long、指针等类型作为模板参数使用。

        在多线程操作中,使用原子变量之后就不需要再使用互斥量来保护该变量了,用起来更简洁。因为对原子变量进行的操作只能是一个原子操作(atomic operation),原子操作指的是不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何的上下文切换。

        多线程同时访问共享资源造成数据混乱的原因就是因为 CPU 的上下文切换导致的,使用原子变量解决了这个问题,因此互斥锁的使用也就不再需要了。

atomic 类成员

1. 原子地以 desired 替换当前值。按照 order 的值影响内存。

desired:存储到原子变量中的值

order:强制的内存顺序

void store( T desired, std::memory_order order = std::memory_order_seq_cst ) noexcept;

void store( T desired, std::memory_order order = std::memory_order_seq_cst ) volatile noexcept;

2. 原子地加载并返回原子变量的当前值。按照order的值影响内存。直接访问原子对象也可以得到原子变量的当前值。

T load( std::memory_order order = std::memory_order_seq_cst ) const noexcept;

T load( std::memory_order order = std::memory_order_seq_cst ) const volatile noexcept;

        内存顺序约束

typedef enum memory_order {
    memory_order_relaxed,   // relaxed
    memory_order_consume,   // consume
    memory_order_acquire,   // acquire
    memory_order_release,   // release
    memory_order_acq_rel,   // acquire/release
    memory_order_seq_cst    // sequentially consistent
} memory_order;

原子变量的使用

#include <iostream>
#include <thread>
#include <atomic>
#include <functional>
using namespace std;

//std::atomic<int> m_value = 0;//错误初始化

//atomic_int m_value = 0;    // 准确初始化
std::atomic<int> m_value(0); // 准确初始化

void increment()
{
    for (int i = 0; i < 5; ++i)
    {
        m_value++;
        cout << i <<"increment number: " << m_value << ", theadID: " << this_thread::get_id() << endl;
        this_thread::sleep_for(chrono::milliseconds(500));
    }
}

void decrement()
{
    for (int i = 0; i < 5; ++i)
    {
        m_value--;
        cout << i << "decrement number: " << m_value  << ", theadID: " << this_thread::get_id() << endl;
        this_thread::sleep_for(chrono::milliseconds(500));
    }
}

int main()
{
    thread t1(increment);
    thread t2(decrement);

    t1.join();
    t2.join();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Design A Twitter Search

title: Notes of System Design No.08 — Design a Twitter Search description: ‘Design a Twitter Search’ date: 2022-05-13 18:01:58 tags: 系统设计 categories: 系统设计 00. What is Twitter Search? 01.Functional Requirement 02. Non-Functional Requirement 03…

【JavaSE】阶段性小结,运用Java实现图书管理系统

文章目录逻辑分析主题框架具体方法添加书籍删除书籍查找书籍借阅书籍归还书籍展示书籍退出系统源码UserNormalUserAdmintUserBookBookListIOperationAddboookOperationDeletbookOperationFindbookOperationShowbookOperationBorrowbookOperationReturnbookOperationExitOperati…

[计算机毕业设计]关联挖掘的服装推荐系统

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

OS>>多线程

文章目录绪论SIGCHLDvolatile概念执行流并行与并发临界资源与临界区互斥和同步线程线程定义线程独立性线程优点线程缺点线程ID线程操作线程创建线程等待线程终止线程分离线程替换线程互斥与同步互斥同步原子性互斥锁/互斥量原理使用抢票情景模拟未加锁前加锁后代码锁使用规范重…

【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计(原理图+源码+仿真工程+论文)

【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计&#xff08;原理图源码仿真工程论文&#xff09; 文章目录【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计&#xff08;原理图源码仿真工程论文&#xff09;资料下载链接任务书设计说明书摘要设计框架架构…

Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow 之五

问题点 7&#xff1a; 关于BLE HIDS data 写入到Android 节点"/dev/uhid"的flow&#xff1b; 关于BLE中的HIDS&#xff0c;首先我们需要理解好角色的定义&#xff1a; GATT Server 作为HID Service 提供者&#xff0c;对应HID Device角色&#xff1b; GATT Client…

maven大全(概述、安装配置、使用步骤)

一、概述 1.什么是maven&#xff1f; 答&#xff1a; 全称是Apache Maven。专门用于管理和构建项目的工具 2.maven有什么作用&#xff1f; &#xff08;1&#xff09;提供了一套标准化的项目结构 官方&#xff1a; 就是使用的idea&#xff0c;eclipse编译器的项目结构不统…

基于Matlab的高压直流输电系统仿真研究

目录 摘要 I Abstract II 第1章 绪论 1 1.1 高压直流输电系统 1 1.2 高压直流输电系统的历史 1 1.3 高压直流输电系统的特点 1 1.4 我国高压直流输电系统的现状 2 1.5 高压直流输电技术的发展前景 5 第2章 高压直流输电控制基本原理 6 2.1 高压直流输电控制系统分层结构 6 2.2 …

领夹直播麦克风常规的使用方法及方案说明

麦克风多对我们来说并不陌生&#xff0c;但领夹式麦克风我们日常可能会用的比较少&#xff0c;像做自媒体、采访等会用到的比较多&#xff0c;它能收到人说话的声音&#xff0c;避开外界嘈杂的声音。接下来我们一起来了解一下领夹式麦克风的相关知识吧&#xff01; 一、领夹式麦…

Win11系统启动文件夹是空的怎么解决?

Win11系统启动文件夹是空的怎么解决&#xff1f;有用户发现自己系统的启动文件夹里面没有任何的文件&#xff0c;这样可能会导致我们的电脑出现问题&#xff0c;导致无法正常的启动桌面程序。那么如何去解决这个问题&#xff0c;一起看看具体的解决方法分享吧。 解决方法&#…

从I/O的视角看DPU

计算的流动性 随手翻开一个公有云&#xff0c;都会发现有不同的计算实例&#xff0c;搭配不同的CPU、内存、网络和存储来应对不同业务的需求. 当云原生和大量的新技术出现后&#xff0c;作为公有云考虑的最重要的一件事情就是提供这些丰富服务的成本: 青云、Ucloud也都在A股上…

[Redis] Spring Boot 使用Redis---RedisTemplate泛型约束乱码问题

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

牛客网-《刷C语言百题》第五期

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;《C语言入门必刷百题》 &#x…

计算机毕业设计ssm+vue+elementUI高校志愿者服务招募网站

项目介绍 随着我国教育制度的改革和社会的进步&#xff0c;越来越多的人希望加入志愿者这个行列从而贡献自己的一份爱。加入志愿者不仅能够更好的锻炼自己&#xff0c;也可以帮助那些需要帮助的人&#xff0c;从而让社会变的更加温暖和美好&#xff0c;尤其是对比较发达的地区…

基于matlab创建基于物理统计的雷达模型(附源码)

目录 一、前言 二、、定义场景 三、定义用于检测生成的雷达 四、生成统计雷达检测 五、定义用于 IQ 信号生成和处理的雷达 六、IQ 信号和处理仿真 七、总结 八、程序 一、前言 此示例演示如何以编程方式从统计雷达模型创建基于物理的雷达模型。 雷达是一种感知系统&…

Zookeeper的功能简介

1.ZooKeeper是什么&#xff1f; ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff…

超神之路 数据结构 2 —— Queue队列实现和循环队列和普通队列的性能比较

接上一篇继续往下挖&#xff0c;在上一篇&#xff0c;我们实现了一个属于自己的动态数组。利用这个动态数组&#xff0c;我们来实现一个基于动态数组&#xff0c;一个属于自己的普通队列Queue。 Queue 是一种它许我们从表的一段进行删除&#xff0c;表的另一端进行插入的线性表…

Docker—苹果Mac安装Docker的两种方式

文章目录Docker简介方式一&#xff1a;官网dmg安装方式二&#xff1a;homebrew安装前置条件brew安装docker关注微信公众号&#xff1a;CodingTechWork&#xff0c;一起学习进步。Docker简介 &emsp docker就是集镜像、容器和仓库三个概念于一身的集装箱&#xff0c;应用于…

GPO:组策略与系统配置

1、所有的服务器不需要按ctrl+alt+del交互式登录; 2、关闭所有机器的睡眠功能 3、所有计算机都不允许登录Microsoft账户; 4、允许IT组进行系统时间修改 5、设定所有职务为managers的用户为本地管理员,除了域控制器 GPO:组策略与系统配置 所有的服务器不需要按ctrl+alt+del;…

基于ELK搭建的本地社工库

简介 ELK原本是一个开源实时日志分析平台。 ELK是三个开源软件的缩写&#xff0c;分别为&#xff1a;Elasticsearch 、 Logstash以及Kibana 。目前又新增了一个Beats&#xff0c;是一个轻量级的日志收集处理工具&#xff0c;Beats占用资源少&#xff0c;适合于在各个服务器上…