C++ 如何实现原子性

1.操作系统如何实现原子性

在单处理器,单核,运行多线程的情况下,我们不使用线程同步工具,

我们会出现,线程之间会互相抢夺,临界区的资源,造成数据不符合我们预期的结果,

后面再说解决办法,那么我们怎么帮助实现原子性

1 屏蔽中断,不让线程之间切换,让它完成再切换

2 底层硬件自旋锁,也是不让切换的思路

在多处理器,多核,运行多线程的情况下,除了上面两点,我们该如何保持原子性呢?

让我们先了解一下 多核 cpu 之间是如何通信的:

如图,通过CPU总线 进行数据交换

问题 1

因为我们每个核心都在执行任务,当我们执行任务时,都在对同一个数据进行修改

那么到底用 哪一个数据呢?

问题 2

当 我们 使用缓存时,数据在缓存 与 磁盘上不一致时,CPU 该如何保持呢?

一致性协议,就是解决这种问题,

所以 当我们 想使用 具有 原子性 的变量时,使用 修改(modified)  独占(exclusive) 的数据

2.在c++中如何实现线程同步

1.使用 条件变量和锁

写一个例子:

三个线程轮流 输出 1 2 3 到 100

std::condition_variable cond;
std::mutex mtu;
int nums = 1;
void fun1()
{while (nums <= 100){{std::unique_lock<std::mutex> lock(mtu);if (nums % 3 == 1){cout << "nums 1:" << nums << endl;nums++;cond.notify_all();}else{cond.wait(lock);}}}cond.notify_all();
}
void fun2()
{while (nums <= 100){{std::unique_lock<std::mutex> lock(mtu);if (nums % 3 == 2){cout << "nums 2:" << nums << endl;nums++;cond.notify_all();}else{cond.wait(lock);}}}cond.notify_all();
}
void fun3()
{while (nums <= 100){{std::unique_lock<std::mutex> lock(mtu);if (nums % 3 == 0){cout << "nums 3:" << nums << endl;nums++;cond.notify_all();}else{cond.wait(lock);}}}cond.notify_all();
}
int main()
{std::thread t1(fun1);std::thread t2(fun2);std::thread t3(fun3);t1.join();t2.join();t3.join();cout << "打印完毕" << endl;return 0;
}

2.使用atomic


std::atomic<int> nums(1);void print_nums(int remainder)
{while (nums <= 100){int current_nums;do{current_nums = nums.load();} while (current_nums % 3 != remainder && !nums.compare_exchange_weak(current_nums, current_nums + 1));if (current_nums <= 100){std::cout << "nums " << remainder + 1 << ":" << current_nums << std::endl;}}
}int main()
{std::thread t1(print_nums, 1);std::thread t2(print_nums, 2);std::thread t3(print_nums, 0);t1.join();t2.join();t3.join();std::cout << "打印完毕" << std::endl;return 0;
}

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

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

相关文章

栈与递归的关系

定义 特点 函数调用过程 具体实现过程与状态 小结 拓展 递归的分解 典型案例

Meta应用上AI泛滥 用户抱怨:还能不能让我好好用

4 月 29 日消息&#xff0c;最近有报道称&#xff0c;Meta 在其社交平台 Facebook 和 Instagram 上大量使用生成式人工智能。但用户则反映&#xff0c;AI 的泛滥导致了大量垃圾信息的出现&#xff0c;尤其是在 Instagram 上&#xff0c;搜索功能被改变用途&#xff0c;使得用户…

第三弹:JavaScript 学习记录

目录 1.1. 了解 1.1.1. 为什么学习JavaScript 1.1.2. JavaScript简介 1.1.3. JavaScript / ECMAScript 1.1.4. JavaScript使用方式 1.1.5. JavaScript输出 1.1.6. JavaScript语句 1.1.7. JavaScript注释 1.1.8. JavaScript变量及常量 1.1.9. JavaScript数据类型 1.1.…

复杂prompt组成

chatGpt像一个具有海量知识的婴儿&#xff0c;了解的知识足够多&#xff0c;但是还不够足够智能。为了能够让gpt能精准回复&#xff0c;一是将问题尽可能描述清楚&#xff0c;帮助gpt理解问题&#xff0c;二是给出一些有效的筛选条件&#xff0c;帮助gpt去从海量知识中筛选可能…

C++实战演练---负载均衡在线oj项目预热

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 前言 学习准备了快一年时间&#xff0c;心心念念的实战演练终于可以开始了&#xff0c;话不多说&#xff0c;直接进入主题…

React、React Router 和 Redux 常用Hooks 总结,提升您的开发效率!

Hooks 是 React 16.8 中引入的一种新特性&#xff0c;它使得函数组件可以使用 state 和其他 React 特性&#xff0c;从而大大提高了函数组件的灵活性和功能性。下面分别总结React、React Router 、Redux中常用的Hooks。 常用Hooks速记 React Hooks useState&#xff1a;用于…

ssm088基于JAVA的汽车售票网站abo+vue

汽车售票网站的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对汽车售票信息管理混乱&#xff0c;出错率…

基于stm32的USB模拟UART的尝试F429

目录 基于stm32的USB模拟UART的尝试F429实验目的场景使用原理图USBX 组件移植USBX实现虚拟串口配置USB移植USBX源码工程中添加对应源码修改usb_otg.c创建 USBX 任务添加使用串口的代码上机现象本文中使用的测试工程 基于stm32的USB模拟UART的尝试F429 本文目标&#xff1a;基于…

uniapp-vue3-wechat:基于uniapp+vue3仿微信app聊天实例(H5+小程序+App端)

uni-vue3-wchat&#xff1a;基于uni-appvue3pinia2高仿微信app聊天模板。 原创基于最新跨端技术uni-appvue3.xpinia2vite4uv-ui构建三端仿微信app界面聊天实例。实现编辑框多行消息/emoj混合、长按触摸式仿微信语音面板、图片/视频预览、红包/朋友圈等功能。支持编译到H5小程序…

Json(标题)

json是一种用于发送和接收结构化信息的标准协议 类似的还有XML,ASN.1 Go语言对这些标准格式和编码都有良好的支持 encoding/xml ,encoding/json json可以表示字符串&#xff0c;数字&#xff0c;布尔值和对象 boolean true number -273.15 string …

Java 笔记 09:Java 流程控制相关,常见的三种控制结构(顺序、选择、循环)

一、前言 记录时间 [2024-04-29] 系列文章简摘&#xff1a; Java 笔记 01&#xff1a;Java 概述&#xff0c;MarkDown 常用语法整理 Java 笔记 02&#xff1a;Java 开发环境的搭建&#xff0c;IDEA / Notepad / JDK 安装及环境配置&#xff0c;编写第一个 Java 程序 Java 笔记 …

数据结构与算法-抽象数据类型ADT系列

以前在学习数据结构的时候做实验&#xff0c;老师要求用ADT抽象数据类型来写这些实现代码。后面也要复习数据结构&#xff0c;在这里就先放下链接。不过以前学习的时候使用的编程语言是C&#xff0c;里面会用到很多指针。现在编代码过程大多数时候都是用Java。不过思路应该还是…

keytool,openssl的使用

写在前面 在生成公钥私钥&#xff0c;配置https时经常需要用到keytool&#xff0c;openssl工具&#xff0c;本文就一起看下其是如何使用的。 keytool是jdk自带的工具&#xff0c;不需要额外下载&#xff0c;但openssl需要额外下载 。 1&#xff1a;使用keytool生成jks私钥文件…

WEB攻防-IIS中间件PUT漏洞

IIS6.0 server在web服务扩展中开启了WebDAV&#xff08;Web-based Distributed Authoring and Versioning&#xff09;。WebDAV是一种HTTP1.1的扩展协议。它扩展了HTTP 1.1&#xff0c;在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法&#xff0c;如PUT&#xff0c…

从事plc工资多少?是不是没前途?

60%以上的人都是8-15K之间吧 应届生刚入行正常就8-10k的样子&#xff0c;根据工龄和经验的增加会慢慢涨&#xff0c;但多大数人也就到15k。 如果做的确实比较好&#xff0c;能力突出的也有20k25k30k的&#xff0c;20k就不说了还正常&#xff0c;30k以上那就算是翘楚了属于行业…

system-auth与password-auth的区别

/etc/pam.d/system-auth和/etc/pam.d/password-auth是两个不同的PAM配置文件&#xff0c;它们在系统上的作用和功能略有不同。 /etc/pam.d/system-auth配置文件是系统的全局认证配置文件&#xff0c;通常包含系统范围内适用的认证规则和策略。这个文件会被其他PAM配置文件引用&…

自动驾驶横向控制算法

本文内容来源是B站——忠厚老实的老王&#xff0c;侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦&#xff0c;将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念&#xff1a; 运动学方程 建立微分方程 主要是弄…

Linux进程——进程的概念(PCB的理解)

前言&#xff1a;在了解完冯诺依曼体系结构和操作系统之后&#xff0c;我们进入了Linux的下一篇章Linux进程&#xff0c;但在学习Linux进程之前&#xff0c;一定要阅读理解上一篇内容&#xff0c;理解“先描述&#xff0c;再组织”才能更好的理解进程的含义。 Linux进程学习基…

Hadoop3:集群搭建及常用命令与shell脚本整理(入门篇,从零开始搭建)

一、集群环境说明 1、用VMware安装3台Centos7.9虚拟机 2、虚拟机配置&#xff1a;2C&#xff0c;2G内存&#xff0c;50G存储 3、集群架构 从表格中&#xff0c;可以看出&#xff0c;Hadoop集群&#xff0c;主要有2部分&#xff0c;一个是HDFS服务&#xff0c;一个是YARN服务 …

记一次内网渗透

环境搭建&#xff1a; 排错&#xff1a; 在搭建过程中发现报错&#xff0c;删除这部分内容就成功解决。 信息收集 端口扫描 使用namp -sn 探测存活IP 接着去查看服务 web服务 然后发现80端口。访问 发现有管理员接口&#xff0c;并泄露了默认用户名和密码。 弱口令登录 …