C++之std::atomic<bool>原子bool类型与普通bool区别(二百六十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之std::atomic原子bool类型与普通bool区别

2.std::atomic原子bool类型与普通bool区别介绍

  • std::atomic 是 C++11 标准库中的一个模板特化,用于表示一个可以原子操作的布尔值。原子操作意味着这些操作是不可中断的,即在多线程环境中,当一个线程正在执行原子操作时,其他线程无法同时访问或修改这个值。

  • 与普通的 bool 类型相比,std::atomic 有以下主要区别和用途:

  • 线程安全:普通的 bool 类型不是线程安全的。如果你在多线程环境中共享一个普通的 bool 变量,并且多个线程可能会同时读取或修改它,那么你需要额外的同步机制(如互斥锁)来避免数据竞争和不一致。而 std::atomic 提供了内建的线程安全保证,无需额外的同步。

  • 原子操作:你可以对 std::atomic 执行原子操作,如 load(), store(), exchange(), compare_exchange_weak(), 和 compare_exchange_strong()。这些操作在多线程环境中是安全的,因为它们在执行时不会被其他线程打断。相比之下,对普通的 bool 的操作(如赋值或读取)通常不是原子的,因此在多线程环境中可能导致问题。

  • 性能:虽然使用 std::atomic 通常比使用互斥锁等同步机制有更高的性能开销,但在某些情况下,它仍然是一个很好的选择。特别是当需要频繁地、快速地访问和修改共享数据时,原子类型可以提供一个相对高效的解决方案,同时保持线程安全。

  • 简化的同步:使用 std::atomic 可以简化代码,因为你不需要显式地管理锁或其他同步机制。这可以使代码更易于理解和维护。

  • 一个典型的 std::atomic 的使用场景是在多线程环境中作为一个标志位或信号量。例如,一个线程可以原子地设置一个 std::atomic 变量来表示某个任务已经完成,而另一个线程可以原子地检查这个变量来确定是否应该继续执行后续操作。

3.代码实例

<1>.普通bool例子:多线程中的非原子操作(可能导致数据竞争)

#include <iostream>  
#include <thread>  
#include <chrono>  bool ready = false; // 非原子布尔变量  void workerThread() {  std::this_thread::sleep_for(std::chrono::seconds(1));  ready = true; // 非原子地设置 ready 为 true  
}  void waitForSignal() {  while (!ready) {  std::cout << "Waiting for the signal...\n";  std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 等待信号  }  std::cout << "Received the signal!\n";  
}  int main() {  std::thread worker(workerThread);  waitForSignal();  worker.join();  return 0;  
}

ready 是一个普通的 bool 变量,不是原子的。因此,在多线程环境中对它的读写可能会导致数据竞争和不确定的行为。

<2>.std::atomic例子:线程间的信号通知

#include <iostream>  
#include <thread>  
#include <atomic>  
#include <chrono>  std::atomic<bool> ready(false); // 初始化为 false 的原子布尔变量  void workerThread() {  std::this_thread::sleep_for(std::chrono::seconds(1)); ready.store(true); // 设置 ready 为 true,通知其他线程  std::cout << "Worker thread finished its work.\n";  
}  int main() {  std::thread t(workerThread);  while (!ready.load()) {  std::cout << "Waiting for the worker thread to finish...\n";  std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 等待 worker 线程完成  }  std::cout << "Main thread detected that the work is ready.\n";  t.join();  return 0;  
}

工作线程运行一个循环,直到 running 变量被设置为 false。主线程在一段时间后设置 running 为 false,工作线程检测到这个变化后停止循环。由于 running 是原子的,因此这个检查操作是线程安全的。

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

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

相关文章

DNA Prefix Trie树

一开始蠢了&#xff0c;想着直接看最后一个&#xff0c;其实直接边插边搞就好了&#xff5e; #include<iostream> #include<vector> #include<cstring> #include<map> using namespace std; using ll long long;const int M 2e610; struct Trie{int …

C#实现身份证格式验证(自建异常实现提醒)

基本信息 中国居民身份证的格式包括18位数字&#xff0c;这些数字分别代表不同的信息&#xff1a; 第1、2位数字表示省份代码。 第3、4位数字表示城市代码。 第5、6位数字表示区县代码。 第7至14位数字表示出生年、月、日&#xff08;其中7、8、9、10位是年&#xff0c;11、12…

高效批量管理文件,轻松实现文件批量复制并覆盖相同文件名,轻松管理文件

亲爱的用户们&#xff0c;您是否在批量复制文件时常常被相同文件名困扰&#xff0c;手动一个个改名繁琐又费时&#xff1f;现在&#xff0c;我们为您推出一款智能的文件批量改名工具&#xff0c;帮助您轻松处理复制时的相同文件名&#xff0c;让文件管理更从容&#xff01; 首…

row_number 函数和关联更新

生成测试数据&#xff0c;房间号数据如下&#xff1a; CREATE TABLE hotel (floor_nbr,room_nbr) ASSELECT 1,100 FROM DUAL UNION ALLSELECT 1,100 FROM DUAL UNION ALLSELECT 2,100 FROM DUAL UNION ALLSELECT 2,100 FROM DUAL UNION ALLSELECT 3,100 FROM DUAL; 里面的房间号…

智慧公厕解决方案打造更加智能的卫生空间

一、智慧公厕方案概述 智慧公厕方案旨在解决现有公厕存在的诸多问题&#xff0c;包括民众用厕困难、环境卫生状况不佳、管理效率低下等方面。针对民众的需求和管理方面的挑战&#xff0c;智慧公厕提供了一套综合解决方案&#xff0c;包括智能导航、环境监测、资源管理等功能&a…

echarts使用基础

1&#xff0c;下载并引入echarts.js文件 2&#xff0c;准备一个具备大小&#xff08;有宽和高&#xff09;DOM容器 3&#xff0c;初始化echarts实例对象 4&#xff0c;指定配置项和相关数据&#xff08;option) 5,将配置项设置给echarts实例对象 下载入口&#xff1a; 官…

大模型重塑电商,淘宝、百度、京东讲出新故事

配图来自Canva可画 随着AI技术日渐成熟&#xff0c;大模型在各个领域的应用也越来越深入&#xff0c;国内互联网行业也随之进入了大模型竞赛的后半场&#xff0c;开始从“百模大战”转向了实际应用。大模型从通用到细分垂直领域的跨越&#xff0c;也让更多行业迎来了新的商机。…

python数据实时传给unity工程并绘制出来

python # 服务器端代码 import socket import random import struct import time# 创建一个服务器Socket server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 监听的地址和端口 host 127.0.0.1 port 12345# 绑定地址和端口 server_socket.bind((host, port…

【机器学习】深入探讨基于实例的学习及K-最近邻算法

深入探讨基于实例的学习及K-最近邻算法 在机器学习的众多策略中&#xff0c;基于实例的学习方法因其简单性和高效性而备受关注。这种方法的核心理念在于利用已知的数据实例来预测新数据的标签或属性。本文将深入探讨其中的两个重要概念&#xff1a;最近邻算法和K-最近邻算法&a…

免费设计原型图必备!这9款工具值得一试!

在当今快速发展的数字世界中&#xff0c;原型图设计工具无疑是设计师必不可少的武器。高效易用的工具不仅能使设计过程更加顺畅&#xff0c;还能有效提高设计质量。在这个竞争激烈的市场上&#xff0c;有许多优秀的免费原型图设计工具可供选择。以下是我们选择的9种免费原型图设…

STM32/GD32的以太网DMA描述符

继续梳理以太网的DMA描述符。 以太网DAM描述符的结构 有两种结构&#xff0c;链式结构和环形结构。 常用的是链式结构。 标准库中&#xff0c;关于DMA描述符的数据结构 以gd32f4xx_enet.c为例。 先说发送描述符。 系统分配了5个发送描述符。每个描述符对应的缓冲区大小为152…

C++ 多线程和互斥锁(一文搞定)

实验 简介&#xff1a;我们启动并行启动两个线程&#xff0c;但设置一个全局互斥锁&#xff0c;在两个线程中等待并占用互斥锁&#xff0c;然后输出日志。 代码 #include <iostream> #include <thread> /* C 多线程库 */ #include <mutex> …

Blenderproc渲染6D位姿估计数据集

https://github.com/DLR-RM/BlenderProc/tree/main/examples/datasets/bop_challenge 目录 1.3d渲染原理 2.步骤 3.代码 生成mask_all 4.难例渲染 物体高反光​编辑​编辑强弱灯光(明暗)​编辑​编辑​编辑物体xyz范围缩小 物体重复 干扰物&#xff08;自定义干扰物遮…

DP1363F高度集成的非接触读写芯片 13.56M NFC/RFID

DP1363F高度集成的非接触读写芯片 13.56M NFC/RFID读卡器芯片 兼容替代CLRC663 DP1363F是一款高度集成的非接触读写芯片&#xff0c;集强大的多协议支持、最高射频输出功率&#xff0c;以及突破性技术低功耗卡片检测等优势于一身&#xff0c;满足市场对更高集成度、更小外壳和互…

Coursera自然语言处理专项课程03:Natural Language Processing with Sequence Models笔记 Week01

Natural Language Processing with Sequence Models Course Certificate 本文是https://www.coursera.org/learn/sequence-models-in-nlp 这门课程的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Natural Language Processing with Sequence ModelsWeek 01…

docker:在ubuntu中运行docker容器

前言 1 本笔记本电脑运行的ubuntu20.04系统 2 docker运行在ubuntu20.04系统 3 docker镜像使用的是ubuntu18.04&#xff0c;这样拉的 docker pull ubuntu:18.04 4 docker容器中运行的是ubuntu18.04的系统&#xff0c;嗯就是严谨 5 这纯粹是学习笔记&#xff0c;实际上没啥价值。…

经纬恒润AUTOSAR产品成功适配芯来RISC-V车规内核

近日&#xff0c;经纬恒润AUTOSAR基础软件产品INTEWORK-EAS&#xff08;ECU AUTOSAR Software&#xff0c;以下简称EAS&#xff09;在芯来提供的HP060开发板上成功适配芯来科技的RISC-V处理器NA内核&#xff0c;双方携手打造了具备灵活、可靠、高性能、强安全性的解决方案。这极…

【分布式】——CAPBASE理论

CAP&BASE理论 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/tree-learning-notes ⭐⭐⭐⭐⭐⭐ Spring专栏&#x1f449;https://blog.csdn.net/weixin_53580595/category_12279588.html Sprin…

STM32使用USART发送数据包指令点亮板载LED灯

电路连接&#xff1a; 连接显示屏模块&#xff0c;显示屏的SCL在B10&#xff0c;SDA在B11。 程序目的&#xff1a; 发送LED_ON指令打开板载LED灯&#xff0c;发送LED_OFF关闭板载LED灯&#xff0c;与上一个博客不同&#xff0c;这个实际上是实现串口收发文本数据包。 …

ES学习日记(一)-------单节点安装启动

基于ES7.4.1编写,其实一开始用的最新的8.1,但是问题太多了!!!!不稳定,降到7.4 下载好的安装包上传到服务器或虚拟机,创建ES目录,命令mkdir -p /路径xxxx 复制安装包到指定路径并解压: tar zxvf elasticsearch-8.1.0-linux-x86_64.tar.gz -C /usr/local/es/ 进入bin目录安装,命…