【BOOST C++ 13 并行编程】(5) Boost.Atomic

news2025/8/11 18:53:05

一、说明

        Boost.Atomic 提供类 boost::atomic,可用于创建原子变量。它们被称为原子变量,因为所有访问都是原子的。 Boost.Atomic 用于多线程程序,当在一个线程中访问变量不应被访问相同变量的另一个线程中断时。如果没有 boost::atomic,从多个线程访问共享变量的尝试将需要与锁同步。

        boost::atomic 取决于支持原子变量访问的目标平台。否则,boost::atomic 使用锁。该库允许您检测目标平台是否支持原子变量访问。

        如果您的开发环境支持 C++11,则不需要 Boost.Atomic。 C++11 标准库提供了一个头文件 atomic,它定义了与 Boost.Atomic 相同的功能。例如,您会发现一个名为 std::atomic 的类。

        Boost.Atomic 支持与标准库大致相同的功能。虽然一些函数在 Boost.Atomic 中被重载,但它们在标准库中可能有不同的名称。标准库还提供了一些 Boost.Atomic 中缺少的函数,例如 std::atomic_init() 和 std::kill_dependency()。

二、示例和代码

        示例 45.1。使用 boost::atomic

Boost.Atomic

#include <boost/atomic.hpp>
#include <thread>
#include <iostream>

boost::atomic<int> a{ 0 };

void thread()
{
	++a;
}
void thread_s()
{
	std::cout << "Hello Thread" << a << '\n';
}

int main()
{
	std::thread t1{ thread };
	std::thread t2{ thread };
	std::thread t3{ thread_s };
	std::thread t4{ thread_s };
	t1.join();
	t2.join();
	t3.join();
	t4.join();

	std::cout << a << '\n';
}

 

 

Example 45.1

        示例 45.1 使用两个线程来递增 int 变量 a。该示例使用 boost::atomic 代替锁来对 a 进行原子访问。该示例将 2 写入标准输出。

        boost::atomic 之所以有效,是因为一些处理器支持对变量的原子访问。如果增加一个 int 变量是一个原子操作,则不需要锁。如果此示例在无法将变量递增为原子操作的平台上运行,则 boost::atomic 使用锁。

        示例 45.2。 boost::atomic 带锁或不带锁

#include <boost/atomic.hpp>
#include <iostream>

int main()
{
  std::cout.setf(std::ios::boolalpha);

  boost::atomic<short> s;
  std::cout << s.is_lock_free() << '\n';

  boost::atomic<int> i;
  std::cout << i.is_lock_free() << '\n';

  boost::atomic<long> l;
  std::cout << l.is_lock_free() << '\n';
}

        您可以在原子变量上调用 is_lock_free() 来检查是否在没有锁的情况下访问该变量。如果您在 Intel x86 处理器上运行示例,它会显示 true 三次。如果您在没有对 short、int 和 long 变量进行无锁访问的处理器上运行它,则会显示 false。

        Boost.Atomic 提供了 BOOST_ATOMIC_INT_LOCK_FREE 和 BOOST_ATOMIC_LONG_LOCK_FREE 宏来在编译时检查哪些数据类型支持无锁访问。

        示例 45.2 仅使用整型数据类型。您不应将 boost::atomic 与 std::string 或 std::vector 等类一起使用。 Boost.Atomic 支持整数、指针、布尔值 (bool) 和普通类。整数类型的示例包括 short、int 和 long。普通类定义可以使用 std::memcpy() 复制的对象。

        示例 45.3。 boost::atomic 和 boost::memory_order_seq_cst

#include <boost/atomic.hpp>
#include <thread>
#include <iostream>

boost::atomic<int> a{0};

void thread()
{
  a.fetch_add(1, boost::memory_order_seq_cst);
}

int main()
{
  std::thread t1{thread};
  std::thread t2{thread};
  t1.join();
  t2.join();
  std::cout << a << '\n';
}

 

 

Example 45.3E

        示例 45.3 增加了两次——这次不是使用 operator++,而是调用 fetch_add()。成员函数 fetch_add() 可以采用两个参数:a 应该递增的数字和内存顺序。

        内存顺序指定内存访问操作必须发生的顺序。默认情况下,这个顺序是不确定的,不依赖于代码行的顺序。只要程序表现得好像内存访问操作是按源代码顺序执行的,编译器和处理器就可以更改顺序。此规则仅适用于线程。如果使用多个线程,内存访问顺序的变化会导致程序运行错误。 Boost.Atomic 支持在访问变量时指定内存顺序,以确保内存访问在多线程程序中以所需的顺序发生。

注意
        指定内存顺序可优化性能,但会增加复杂性并使编写正确代码变得更加困难。因此,在实践中,您应该有充分的理由使用内存顺序。

        示例 45.3 使用内存顺序 boost::memory_order_seq_cst 将 a 递增 1。内存顺序代表顺序一致性。这是最严格的内存顺序。在 fetch_add() 调用之前出现的所有内存访问必须在执行此成员函数之前发生。在 fetch_add() 调用之后出现的所有内存访问都必须在执行此成员函数之后发生。编译器和处理器可以在调用 fetch_add() 之前和之后重新排序内存访问,但它们不得将内存访问从调用 fetch_add() 之前移动到调用之后,反之亦然。 boost::memory_order_seq_cst 是双向内存访问的严格边界。

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

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

相关文章

Windows取证——隐藏用户

前言&#xff1a; 实验环境&#xff1a;Windows server 2019 实验目的&#xff1a;了解Windows隐藏账户的工作原理&#xff0c;有针对性地对隐藏账户进行应急处置。 目录 前言&#xff1a; 一、隐藏用户的建立 二、查看隐藏用户 法一&#xff1a;计算机管理本地用户和组查看…

Java集合(复习)

Java中的集合 Java中的集合概述Collection 接口中常用的方法Iterator 迭代器forEach 增强for循环Collection子接口之一&#xff1a;List 接口ArrayList 源码分析LinkedLIst 源码分析Vector 源码分析List 接口常用的方法Collection 子接口之二&#xff1a; Set 接口HashSetLinke…

OnlineJudge平台(负载均衡)

文章目录1.所用技术与开发环境2.项目宏观结构3.compiler服务设计4. 基于MVC结构的oj服务设计5. 前端页面设计6 安装指南升级 gcc安装 jsoncpp安装 cpp-httplib安装boost库安装与测试 ctemplate使用Ace在线编辑器&#xff08;直接复制粘贴即可&#xff09;在线OJ样例题目MySQL 建…

SVN的基本使用

文章目录1.什么是SVN&#xff1f;2.SVN跟Git比,有什么优势&#xff1f;3.SVN的主要应用4.SVN仓库(SVN的服务端)5.SVN客户端6.SVN的基本操作6.1 代码检出 checkout6.2添加文件 add6.3提交代码 commit6.4 更新代码 update7.撤销和恢复7.1 撤销本地修改7.2 撤销已提交内容7.3 恢复…

第一章《初学者问题大集合》第5节:Java开发环境的搭建

上一小节阐述了Java程序运行的过程和原理&#xff0c;但那都一些理论&#xff0c;并没有真正的实战操作。此时读者们肯定想知道&#xff1a;从哪里才能搞到一个编译器和那个传说中能让Java程序得以运行的虚拟机呢&#xff1f;有了虚拟机&#xff0c;又怎样才能让Java程序在电脑…

[附源码]计算机毕业设计JAVA广州中小学学校信息管理系统

[附源码]计算机毕业设计JAVA广州中小学学校信息管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

ASEMI代理艾赛斯IXFK32N100P,车规级MOS管IXFK32N100P

编辑-Z 艾赛斯车规级MOS管IXFK32N100P参数&#xff1a; 型号&#xff1a;IXFK32N100P 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;1000V 连续漏电流&#xff08;ID&#xff09;&#xff1a;32A 功耗&#xff08;PD&#xff09;&#xff1a;960W 工作结温度&am…

一文带你快速了解【内部类】

1. 什么是内部类&#xff1f; 在一个类 A 中&#xff0c;又定义了一个类 B &#xff0c;此时这个类 B 就是内部类&#xff0c;而类 A 则是外部类&#xff01;内部类也是一种封装得表现 public class A{class B{} }我们看上面代码&#xff0c;此时 A 就是外部类&#xff0c;B …

美团外卖搜索基于Elasticsearch的优化实践

美团外卖搜索工程团队在Elasticsearch的优化实践中&#xff0c;基于Location-Based Service&#xff08;LBS&#xff09;业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-Length Encoding&#xff08;RLE&#xff09;设计了一款高效的倒排索引结构&#xff0c;使检索…

蚂蚁集团最新业绩出炉:净利润同比下降63%,连续三个季度下滑

11月17日&#xff0c;阿里巴巴集团&#xff08;简称“阿里”&#xff0c;HK:09988、NYSE:BABA&#xff09;公布2023财年第二季度&#xff08;对应自然年2022年第三季度&#xff09;业绩。财报显示&#xff0c;阿里巴巴2022年第三季度的收入为人民币2071.76亿元&#xff08;约合…

用 Python 编写 Chrome 扩展赚美刀,通过使用 PyScript 非常轻松(教程含源码)

有很多文章介绍了用于将 Python 代码直接嵌入 HTML的PyScript的出现,但直到现在,在Python中创建浏览器扩展一直是一扇紧闭的门。 我很幸运地获得了PyScript 的工程经理的帮助,并最终弄清楚了如何将 Python 脚本作为 Chrome 扩展运行,并在弹出框中显示输出(参见上面的屏幕…

m无线通信的信道建模matlab仿真,仿真分析了6种不同的无线通信信道模型

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 无线电波的传播环境非常复杂&#xff0c;再加上无线电波自身的多样性&#xff0c;使得电波会通过多种方式和途径从发射天线传播到接收天线。无线视距是指与无线视线相关的路径的长度&…

floyd-warshall算法浅理解

相比于矩阵乘法&#xff0c;floyd巧妙利用了最短路具有最优子结构的性质&#xff0c;即最短路径的子路径也是最短路径&#xff0c;得到以dij(k)d_{ij}^{(k)}dij(k)​&#xff08;为从i到j的一条中间节点全部取自集合{1,2,...,k}\{1,2,...,k\}{1,2,...,k}的一条最短路径权重&…

全球人口突破80亿!免费分享全球人口分布数据

概述 就在2022年11月15日16:00左右全球人口突破80亿&#xff01; 全球人口突破80亿 根据此前联合国人口基金会的统计&#xff0c;全球人口在2011年10月31日达到了70亿。 全球人口从70亿增长到今天的80亿&#xff0c;用了11年零半个月。 到2022年&#xff0c;全球哪里人口最…

分组查询子查询

分组查询 分组查询是指使用 group by 字句对查询信息进行分组。 格式: SELECT 字段1,字段2… FROM 表名 GROUP BY分组字段 HAVING 分组条件; 分组操作中的 having 子语句&#xff0c;是用于在分组后对数据进行过滤的&#xff0c;作用类似于 where 条 件。 having与where的区…

在agx xavier上运行 deepstream的样例 deepstream-test4

在agx xavier上运行 deepstream的样例 deepstream-test4 主要演示如何将检测结果通过kafka发送到服务器。 deepstream版本&#xff1a;5.0 前置条件&#xff1a;服务器上正常运行的kafka服务。 下面主要讲发送端的操作。 1、安装依赖项 1&#xff09;所有样例都需要的依赖…

Prometheus 采集snmp监控数据

download snmp_exporter snmp_exporter采集数据 snmp_exporter 一键监控安装脚本 vim /snmp_exporter.sh #!/bin/sh # -*- coding: utf-8 -*- # Date: 2022/11/18echo "download snmp_exporter" sleep 2 wget -N -P /root/ https://github.com/prometheus/snmp_ex…

美食杰项目 -- 菜谱大全(二)

目录前言&#xff1a;具体实现思路&#xff1a;步骤&#xff1a;1. 展示美食杰菜谱大全效果2. 引入element-ui3. 代码总结&#xff1a;前言&#xff1a; 本文给大家讲解&#xff0c;美食杰项目中菜谱大全实现的效果&#xff0c;和具体代码。 具体实现思路&#xff1a; 点击头…

金蝶苍穹开发工程师初级学习第一节

金蝶苍穹开发工程师初级学习第一节 ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;金蝶首发&#xff01; &#x1f618;系列专栏&#xff1a;低代码学习 &#x1f4bb;首发时间&#xff1a;&#x1f39e;2022年11月12日&a…

github action定时任务

需求 定时任务1 (8:00~13:00)&#xff0c;执行bash脚本定时任务2 (18:00)&#xff0c;修改定时任务1的执行时间 文档 workflows官方文档workflows action uses查询actions/checkoutv3About the GITHUB_TOKEN secret 问题之refusing to allow a GitHub App to create or upd…