【C++】线程安全问题

news/2024/11/29 1:45:03/

原子类型非线程安全

#include <iostream>
#include <thread>int main() {int num = 0;int count = 100000;std::thread thread1([&](){for(int i = 0; i < count; i++){num++;}});std::thread thread2([&](){for(int i = 0; i < count; i++){num++;}});std::thread thread3([&](){for(int i = 0; i < count; i++){num++;}});std::thread thread4([&](){for(int i = 0; i < count; i++){num++;}});thread1.join();thread2.join();thread3.join();thread4.join();std::cout << "num: " << num << std::endl;return 0;
}

预期结果
400000

实际结果
在这里插入图片描述

线程安全代码

atomic

#include <iostream>
#include <thread>
#include <atomic>int main() {std::atomic<int> num(0);int count = 100000;std::thread thread1([&](){for(int i = 0; i < count; i++){num++;}});std::thread thread2([&](){for(int i = 0; i < count; i++){num++;}});std::thread thread3([&](){for(int i = 0; i < count; i++){num++;}});std::thread thread4([&](){for(int i = 0; i < count; i++){num++;}});thread1.join();thread2.join();thread3.join();thread4.join();std::cout << "num: " << num << std::endl;return 0;
}

std::mutex

#include <iostream>
#include <thread>
#include <mutex>class Num{
public:Num(){num = 0;}void add(){std::lock_guard<std::mutex> lock(mtx);num++;}int getNum(){std::lock_guard<std::mutex> lock(mtx);return num;}
private:int num;std::mutex mtx;
};int main() {Num num;int count = 100000;std::thread thread1([&](){for(int i = 0; i < count; i++){num.add();}});std::thread thread2([&](){for(int i = 0; i < count; i++){num.add();}});std::thread thread3([&](){for(int i = 0; i < count; i++){num.add();}});std::thread thread4([&](){for(int i = 0; i < count; i++){num.add();}});thread1.join();thread2.join();thread3.join();thread4.join();std::cout << "num: " << num.getNum() << std::endl;return 0;
}

http://www.ppmy.cn/news/1078705.html

相关文章

spring高级源码50讲-9-19(springAOP)

文章目录 AOP9) AOP 实现之 ajc 编译器收获&#x1f4a1; 10) AOP 实现之 agent 类加载收获&#x1f4a1; 11) AOP 实现之 proxy演示1 - jdk 动态代理收获&#x1f4a1;演示2 - cglib 代理收获&#x1f4a1; 12) jdk 动态代理进阶演示1 - 模拟 jdk 动态代理收获&#x1f4a1;演…

钢筋水泥中的信仰--爱摸鱼的美工(16)

好久没有更新了&#xff0c;爱摸鱼的美工摸鱼太久可&#xff0c;终于出了一起钢筋水泥中的信仰&#xff0c;希望人们更加坚定个人的信仰。

C++进阶之多态

多态 多态的概念多态的定义及实现1.多态的构成条件2.虚函数3.虚函数的重写4.虚函数重写的两个例外5.C11 override 和 final6.重载、覆盖(重写)、隐藏(重定义)的对比 抽象类1.概念2.接口继承和实现继承 多态的原理1.虚函数表2.多态的原理3.动态绑定与静态绑定 单继承和多继承关系…

Java 循环语句解析:从小白到循环达人

如果你正在学习编程&#xff0c;那么循环语句是一个绕不开的重要话题。循环语句让我们能够重复执行一段代码&#xff0c;从而实现各种各样的功能。在本篇博客中&#xff0c;我们将围绕 Java 编程语言中的循环语句展开&#xff0c;从最基础的概念出发&#xff0c;一步步引领你从…

信息化发展15

元宇宙 元宇宙是将虚拟世界与现实世界在经济系统、社交系统、身份系统上密切融合&#xff0c;允许每个用户进行内容生产和编辑的新型社会体系的数字生活空间。元宇宙的主要特征包括&#xff1a; 1 &#xff09;沉浸式体验&#xff1a; 元宇宙的发展主要基于人们对互联网体验的…

git 提交错误,回滚到某一个版本

git log 查看版本号 commit 后面跟的就是版本号git reset --hard 版本号 &#xff08;就可以回滚到你要去的版本&#xff09;git push -f &#xff08;因为本地回滚了&#xff0c;所以和远程会差几个版本。所以这时候只有强制推送&#xff0c;覆盖远程才可以&#xff09;

图解 STP

网络环路 现在我们的生活已经离不开网络&#xff0c;如果我家断网&#xff0c;我会抱怨这什么破网络&#xff0c;影响到我刷抖音、打游戏&#xff1b;如果公司断网&#xff0c;那老板估计会骂娘&#xff0c;因为会影响到公司正常运转&#xff0c;直接造成经济损失。网络通信中&…

Kubernetes技术--使用kubeadm搭建高可用的K8s集群(贴近实际环境)

1.高可用k8s集群架构(多master) 2.安装硬件要求 一台或多台机器,操作系统 CentOS7.x-86_x64 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多 注: 这里属于教学环境,所以使用三台虚拟机模拟实现。 3.部署规划 4.部署前准备 (1).关闭防火墙 systemctl stop fi…