C++11:atomic原子操作

文章目录

  • atomic概念
  • atomic实例
  • 分析

atomic概念

std::atomic 是 C++ 中的一个类模板,用于提供原子操作的类型。它是为了在多线程环境下进行并发操作时保证数据的原子性而设计的。

原子操作是指不会被中断的操作,它们要么完全执行成功,要么完全不执行。在多线程环境下,如果多个线程同时访问和修改同一块内存区域,可能会导致不确定的结果或数据竞争问题。std::atomic 提供了一种可靠的机制来避免这些问题。

std::atomic 可以包装基本类型(如整型浮点型)和用户自定义类型,使其具备原子操作的特性。使用 std::atomic 声明的变量可以通过成员函数调用来进行原子操作,如加载(load)、存储(store)、交换(exchange)、比较与交换(compare_exchange_weak/compare_exchange_strong)等。

使用 std::atomic 可以有效地确保对共享数据的正确性和一致性,避免数据竞争和并发问题,提供了一种可靠的方式来处理多线程环境下的并发操作。然而,需要注意的是,并非所有的操作都可以被原子化,某些复杂的操作可能需要其他同步机制来保证数据的一致性。

atomic实例

#include <iostream>
#include <thread>
#include <atomic>std::atomic<int> counter(0);void incrementCounter() {for (int i = 0; i < 100000; ++i) {counter.fetch_add(1);}
}int main() {std::thread t1(incrementCounter);std::thread t2(incrementCounter);t1.join();t2.join();std::cout << "Counter value: " << counter << std::endl;return 0;
}

分析

在这个例子中,我们定义了一个全局的 std::atomic 类型的变量 counter,并初始化为0。然后创建两个线程 t1 和 t2,它们都会调用 incrementCounter 函数。

incrementCounter 函数中,使用原子操作 fetch_add 来递增 counter 变量的值。fetch_add 是一个原子操作,它会将 counter 的旧值加上给定的参数,并返回旧值。这样就确保了多个线程同时进行递增操作时不会发生竞争条件。

在 main 函数中,我们启动了两个线程来执行 incrementCounter 函数,然后等待两个线程执行完毕。最后输出 counter 的值,我们可以看到输出的结果应该是 200000,因为每个线程会递增 counter 100000 次。

这个例子展示了如何使用 std::atomic 来实现线程安全的原子操作,确保多个线程对共享变量的访问和修改是同步的,避免了数据竞争问题。

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

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

相关文章

TP6上传图片到OSS(记录贴)

1&#xff0c;先安装&#xff0c;我使用composer安装 在项目的根目录运行composer require aliyuncs/oss-sdk-php 2,安装成功以后vendor目录下可以看到如图&#xff1a; 3&#xff0c;上传图片代码如下&#xff1a; <?php namespace app\controller;use app\BaseControll…

React 模态框的设计(八)优化补充

在之前的弹窗的设计中&#xff0c;有两处地方现在做一点小小的优化&#xff0c;就是把_Draggable.jsx中的 onPointerEnter 事件 用 useLayoutEffect来规换&#xff0c;效果更佳&#xff0c;同样的&#xff0c;在_ModelContainer.jsx中也是一样。如下所示&#xff1a; _Draggabl…

1、docker入门

文章目录 1、tocker简介2、tocker的安装&环境配置2、配置阿里云镜像3、基本命令1、镜像命令2、docker基本命令3、镜像基本命令4、Docker 容器常用命令 1、tocker简介 新一代的虚拟化技术 2、tocker的安装&环境配置 uname -r1、首先查看liunx的内核 yum update -y2、更…

生成voc格式数据集

数据集存放格式&#xff1a;&#xff08;Annotations文件夹放标注的xml文件&#xff0c;JPEGImages文件夹放标注的图片&#xff09; 运行代码&#xff1a; import os import random import xml.etree.ElementTree as ETimport numpy as npdef get_classes(classes_path):with …

USACO 2024 Feb Bronze铜组题解

闲话:今天是4年一度的奇观——2月29日!(地球人都知道) 所以为了纪念这个特殊的日子&#xff0c;我决定倒着讲。这是什么奇怪的规矩&#xff1f;(雾 Maximizing Productivity: 二分即可。 #include <bits/stdc.h> using namespace std; const int maxn200005; int c[ma…

补一次buuctf_crypto的脚本

题目是&#xff1a;Buuctf_crypto_还原大师 本篇写作原因&#xff1a;嗯&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;我记得我这篇文章写过啊&#xff0c;怎么找不到了。在这传一下我改进的脚本&#xff1a; import hashlib k TASC?O3RJMV?WDJKX?ZM for…

深入理解Java中的优先级队列(堆)——PriorityQueue

引言&#xff1a; 在Java中&#xff0c;优先级队列&#xff08;PriorityQueue&#xff09;是一种基于堆结构实现的队列&#xff0c;其中每个元素都有一个优先级&#xff0c;优先级高的元素在队列中具有更高的优先级&#xff0c;排在前面。优先级队列常用于任务调度、事件处理等…

LeetCode——栈和队列(Java)

栈和队列 简介[简单] 232. 用栈实现队列[简单] 225. 用队列实现栈[简单] 20. 有效的括号[简单] 1047. 删除字符串中的所有相邻重复项[中等] 150. 逆波兰表达式求值[困难] 239. 滑动窗口最大值[中等] 347. 前 K 个高频元素 简介 记录一下自己刷题的历程以及代码。写题过程中参考…

网工内推 | 项目经理,软考证书优先,最高26K,加班补贴

01 龙盈智达 招聘岗位&#xff1a;项目经理 职责描述&#xff1a; 1 根据业务员需求&#xff0c;完成生态圈下账簿中心系统的开发管理工作。 2 负责账簿中心实施过程中的需求调研分析、方案设计、开发测试、系统上线等工作的计划、组织协调、沟通等方面管理工作。 3 完成系统核…

Spring八股 常见面试题

什么是Spring Bean 简单来说&#xff0c;Bean 代指的就是那些被 IoC 容器所管理的对象。我们需要告诉 IoC 容器帮助我们管理哪些对象&#xff0c;这个是通过配置元数据来定义的。配置元数据可以是 XML 文件、注解或者 Java 配置类。 将一个类声明为 Bean 的注解有哪些? Com…

发掘效率黑科技:Allure报告助您事半功倍提升测试效能!

Allure 简介与安装 Allure 是由 Java 语⾔开发的⼀个轻量级&#xff0c;灵活的测试报告⼯具。 Allure 多平台的 Report 框架。 Allure ⽀持多语⾔&#xff0c;包括 python、JaveScript、PHP、Ruby 等。 可以为开发/测试/管理等人员提供详尽的的测试报告&#xff0c;包括测试…

el-table 指定表格合并行与单元格,以及表头合并单元格

1&#xff1a;页面html <template><div class"container"><div class"flex-end"><el-button type"primary" click"allEndBtn">批量办结</el-button><el-button type"primary" click"…

面向对象编程入门:掌握C++类的基础(2/3):深入理解C++中的类成员函数

在C编程中&#xff0c;类是构建程序的基石&#xff0c;而理解类的默认成员函数对于高效使用C至关重要。本文将深入探讨这六个默认成员函数及其他相关概念&#xff0c;提供给读者一个全面的视角。 类的6个默认成员函数&#xff1a; 如果一个类中什么成员都没有&#xff0c;简称为…

【长期更新】游戏开发中可能会用到的数学小工具

从一个向量生成一组正交基 https://graphics.pixar.com/library/OrthonormalB/paper.pdf

【前端素材】推荐优质后台管理系统Dashy平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

MySQL 如何从 Binlog 找出变更记录并回滚

文章目录 前言1. 案例模拟1.1 确认信息1.2 下载 Binlog1.3 准备环境1.4 注册 Binlog1.5 准备结构信息1.6 Python 订阅1.7 输出结果展示 2. 原理解析2.1 程序设计2.2 模块版本 总结 前言 最近有研发同学问我&#xff1a;有一个问题&#xff0c;想查一个 ID 为 xxxx 的 sku 什么…

经典DP-最长单调子序列

最长递增子序列 思路 定义状态&#xff1a; 我们定义一个数组 dp&#xff0c;其中 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。初始化状态&#xff1a; 对于数组中的每个元素 nums[i]&#xff0c;初始时都可以被视为一个长度为1的递增子序列&#xff0c;因此 dp[i] 的…

常用的桌面端自动化测试工具

桌面端软件相比Web端软件而言&#xff0c;因为界面元素的多种形态&#xff0c;导致其定位更难&#xff0c;目前市面上常见的定位方式一般是两种&#xff0c;一种是通过控件本身的属性定位&#xff0c;第二种是通过图片识别来定位&#xff0c;市面上常用的可以支持不同操作系统的…

Qt6内嵌CEF

一、下载CEF CEF下载地址&#xff1a;https://cef-builds.spotifycdn.com/index.html 或https://bitbucket.org/chromiumembedded/cef/src/master/ 选择对应系统的版本&#xff08;本教程选择的是116.0.19&#xff09; CMake下载地址&#xff1a;https://cmake.org/download…

抖店电子面单怎么发货?发货失败是什么原因?看完你就知道了!

我是电商珠珠 对于抖店来说&#xff0c;必须用平台的电子面单发货&#xff0c;否则就会被平台判定无货源违规。但是&#xff0c;关于发货这方面&#xff0c;一些新手还不知道怎么搞&#xff0c;今天我就来给大家详细的讲一下。 怎么用电子面单发货&#xff1f; 1、电脑搜索“…