《C++11 基于CAS无锁操作的atomic原子类型》

count++;
count--;

我们知道,++/--操作并不是原子性的,其实对应三条汇编指令来完成的。

  • 读取:从内存中把变量的值读取到寄存器
  • 修改:在寄存器里将变量的值+1/-1
  • 写入:把修改后的值写入到内存

在单线程环境下,这三个步骤是顺序执行的不会有问题。但是在多线程环境下,多个线程可能对同一个变量同时进行++/--操作,从而导致数据竞争的问题。

可以看下面的过程演示。

一:

二:

三:

C++11是通过加锁来保证++/--操作的原子性的。

std::lock_guard<std::mutext>(mtx);
count++;
std::unlock_guard<std::mutex>(mtx);

互斥锁是比较重的,临界区代码稍稍复杂的情况下建议使用。从系统理论上来讲,使用CAS无锁操作来保证++/--操作的原子性就足够了,其实并不是不加锁,只是不在软件层面上加锁解锁,而是在硬件层面上实现的。

#include<iostream>
#include<thread>
#include<list>
#include<atomic>
using namespace std;volatile std::atomic_bool isReady = false;
volatile std::atomic_int myCount = 0;void task()
{while (!isReady){std::this_thread::yield(); // 线程让出当前的CPU时间片,等待下一次调度}for (int i = 0; i < 100; i++){myCount++;}
}
int main()
{list<std::thread> tlist;for (int i = 0; i < 10; i++){tlist.push_back(std::thread(task));}std::this_thread::sleep_for(std::chrono::seconds(3));isReady = true;for (auto& t : tlist){t.join();}std::cout << "myCount: " << myCount << std::endl;return 0;
}

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

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

相关文章

C++常用多线程模式

文章目录 1. Fork - Join模式2. Producer - Consumer模式3. Readers - Writers模式4. Work Thread模式5. Actor模式6、 Pipeline模式概述应用场景C实现示例代码解释 1. Fork - Join模式 原理&#xff1a;将一个大任务分解为多个子任务&#xff0c;这些子任务在不同的线程中并行…

【时时三省】(C语言基础)习题2 scanf函数

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 用下面的scanf函数输入数据&#xff0c;使a 3&#xff0c;b 7&#xff0c;x 8.5&#xff0c;y 71.82&#xff0c;c1 A&#xff0c;c2 x在键盘上应如何输入? 分析第一个 scanf 函数&…

微信小程序计算属性与监听器:miniprogram-computed

小程序框架没有提供计算属性相关的 api &#xff0c;但是官方为开发者提供了拓展工具库 miniprogram-computed。 该工具库提供了两个功能&#xff1a; 计算属性 computed监听器 watch 一、安装 miniprogram-computed 在项目的根目录下&#xff0c;使用如下命令&#xff0c;…

SOFAStack-00-sofa 技术栈概览

SOFAStack 前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 &#x1f31f; 核心项目 ⚙️ SOFABoot GitHub: sofastack/sofa…

企业模板(QiMoban)是一个专注于企业官网搭建的高效平台

企业模板(QiMoban.com )是一个专注于为企业提供高效、低成本网站建设解决方案的平台&#xff0c;主要面向中小企业和创业者。其核心优势在于帮助用户快速搭建企业官网&#xff0c;提升品牌形象并拓展业务渠道。以下是关于企业模板(QiMoban.com )的详细分析&#xff1a; 适用场…

Oracle 数据库安全评估(DBSAT)简明过程

下载DBSAT 从这里下载。 实际是从MOS中下载&#xff0c;即&#xff1a;Oracle Database Security Assessment Tool (DBSAT) (Doc ID 2138254.1)。 最新版本为3.1.0 (July 2024)&#xff0c;名为dbsat.zip&#xff0c;近45MB。 $ ls -lh dbsat.zip -rw-rw-r-- 1 oracle oins…

【Linux 维测专栏 1 -- Hung Task 分析与验证】

文章目录 Linux Hung Task 简介1. Hung Task 概述2. D 状态与 Hung Task3. Hung Task 的工作原理4. Hung Task 的配置5. Hung Task 的典型输出6. Hung Task 的应用场景7. kernel 配置7.1 编译选项7.2 参数控制7.3 验证方法4. 扩展接口 8. 注意事项 Linux Hung Task 简介 1. Hu…

GCC 预定义宏:解锁编译器的隐藏信息

GCC 预定义宏&#xff1a;解锁编译器的隐藏信息 在 GCC 编译器中&#xff0c;有许多内置的预定义宏&#xff0c;它们可以提供编译环境的信息&#xff0c;如文件名、行号、时间、版本等。这些宏在调试、日志记录、条件编译等场景中非常有用。本文将介绍常见的 GCC 预定义宏&…

公链开发费用及其构成内容详析

在区块链技术迅速发展的今天&#xff0c;公链&#xff08;Public Blockchain&#xff09;作为去中心化、不可篡改、高安全性的重要应用之一&#xff0c;在金融、供应链、游戏等多个领域得到了广泛应用。然而&#xff0c;开发一条公链并非易事&#xff0c;它不仅需要高度专业技能…

Java求101-200之间有多少素数

Java学习笔记 今天看教程看到了这个题&#xff0c;对于一名打过算法竞赛的选手还是很简单的&#xff0c;但由于之前是c组的&#xff0c;所以用java写一下&#xff0c;练一下手。 代码&#xff1a; package com.itheima.hello;public class Test1 {public static void main(S…

DM 达梦上的日志挖掘 DBMS_LOGMNR

适用场景 在 DM 中&#xff0c;用户可以使用 DBMS_LOGMNR 包对归档日志进行挖掘&#xff0c;重构出 DDL 和 DML 等操作&#xff0c;并通过获取的信息进行更深入的分析&#xff1b;同样&#xff0c;可以对归档日志文件进行恢复被误操作的数据&#xff0c;并进行故障跟踪&#x…

JavaWeb之WebSocket

目录 一、 websocket 概念二、WebSocket原理三、WebSocket特点四、WebSocket应用场景五、Websocket基本使用1、创建Websocket对象2、Websocket事件3、Websocket方法4、前端服务程序 六、聊天室案例1、Tomcat版本&#xff1a;8.0.442、Maven 依赖&#xff1a;3、前端代码4、后端…

Unity Shader编程】之透明物体渲染

以下是针对您提出的关于 Unity Shader 渲染 Pass 的查看方法、多个 Pass 的影响、Pass 的含义&#xff0c;以及 Unity 渲染物体的流程和处理多个透明/半透明/不透明物体的详细解答。 1. Unity Shader 渲染 Pass 的查看方法 查看 Pass 的方法 通过 Shader 代码&#xff1a; 打开…

字符指针的三道例题+算法改进

目录 一.杨氏矩阵 1.初级 2.想把下标带回来 二.字符串左旋 算法改进 三.判断是否为字符串旋转结果 算法改进 四. 3个字符函数 1.strcat 2.strncat 3.strstr 一.杨氏矩阵 数字矩阵&#xff0c;每行从左到右递增&#xff0c;每列从上到下递增&#xff0c;编写程序在矩…

VSCode中搜索插件显示“提取扩展时出错。Failed to fetch”问题解决!

大致的问题如下&#xff0c;在VSCode的插件商店搜索插件时提示如下&#xff1a; 导致的情况有以下几点&#xff1a; 1、代理问题&#xff0c;如果是代理引起的&#xff0c;可以继续使用代理后也能搜索和安装插件。 2、还有可能是你的所连接的网络设置了防火墙&#xff0c;比较…

双指针(2)—三数之和

文章目录 题目解析解法&#xff08;排序双指针&#xff09;&#xff1a;哈希解法附加Java代码&#xff1a; 力扣题目&#xff1a;三数之和 题目解析 解法&#xff08;排序双指针&#xff09;&#xff1a; **算法思路&#xff1a;** 本题与两数之和类似&#xff0c;是⾮常经典的…

设计一套水产养殖系统

设计一套水产养殖系统 引言 水产养殖在全球粮食安全和经济发展中日益重要。它不仅为不断增长的人口提供了重要的蛋白质来源&#xff0c;还在许多地区创造了就业机会并促进了经济增长 。全球超过一半的人类消费的海产品来自水产养殖&#xff0c;并且这一比例预计将继续上升 。…

统计可重复列表中的TOP N

文章目录 方案1&#xff1a;HashMap统计 全排序实现步骤&#xff1a;代码实现&#xff1a;优缺点&#xff1a; 方案2&#xff1a;HashMap统计 最小堆&#xff08;优先队列&#xff09;实现步骤&#xff1a;代码实现&#xff1a;优缺点&#xff1a; 方案3&#xff1a;Java Str…

JVM 知识点梳理

JDK 、JRE、JVM JDK&#xff08; Java Development Kit &#xff09; Java开发工具包 JRE 开发命令工具&#xff08;运行java.exe、编译javac.exe、javaw.exe&#xff09; JRE&#xff08; Java Runtime Environment &#xff09;Java运行环境 JVM Java核心类库&#xff08;l…

淘宝历史价格数据获取指南:API 与爬虫方案的合法性与效率对比

引言 在淘宝平台的购物生态中&#xff0c;消费者希望通过了解商品历史价格来判断当前价格是否实惠&#xff0c;商家也需要借助历史价格数据制定合理的营销策略、分析市场趋势。获取淘宝商品历史价格数据主要有 API 和爬虫两种方案&#xff0c;它们在合法性与效率上存在显著差异…