广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++BoostAtomic详细讲解
  • 510
分享到

C++BoostAtomic详细讲解

C++BoostAtomicC++Atomic 2022-11-21 22:11:50 510人浏览 泡泡鱼
摘要

目录一、说明二、示例和代码一、说明 Boost.Atomic 提供类 boost::atomic,可用于创建原子变量。它们被称为原子变量,因为所有访问都是原子的。 Boost.Ato

一、说明

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';
}

Example45.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';
}

Example45.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 是双向内存访问的严格边界。

到此这篇关于C++ Boost Atomic详细讲解的文章就介绍到这了,更多相关C++ Boost Atomic内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++BoostAtomic详细讲解

本文链接: https://www.lsjlt.com/news/173286.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++BoostAtomic详细讲解
    目录一、说明二、示例和代码一、说明 Boost.Atomic 提供类 boost::atomic,可用于创建原子变量。它们被称为原子变量,因为所有访问都是原子的。 Boost.Ato...
    99+
    2022-11-21
    C++ Boost Atomic C++ Atomic
  • C++BoostUtility超详细讲解
    目录一、说明二、Boost.Utility库示例和代码一、说明 Boost.Utility 库是杂项、有用的类和函数的集合,它们太小而无法在独立库中维护。虽然实用程序很小并且可以快速...
    99+
    2022-12-08
    C++ Boost Utility C++ Utility库
  • C++BoostUuid超详细讲解
    目录一、说明二、Boost.Uuid库示例和代码一、说明 Boost.Uuid 为 UUID 提供生成器。 UUID 是不依赖于中央协调实例的通用唯一标识符。例如,没有数据库存储所有...
    99+
    2022-12-08
    C++ Boost Uuid C++ Uuid标识符
  • C# 多线程详细讲解
    多线程是指在一个程序中同时执行多个线程,每个线程可以独立执行不同的任务。在 C# 中,可以使用 System.Threading 命...
    99+
    2023-09-09
    C#
  • C++BoostBimap示例详细讲解
    目录一、提要二、示例练习一、提要 库 Boost.Bimap 基于 Boost.MultiIndex 并提供了一个无需先定义即可立即使用的容器。该容器类似于 std::map,但支持...
    99+
    2022-11-13
    C++ Boost Bimap C++ Bimap库
  • C++超详细讲解泛型
    目录1.了解泛型编程2.函数模板2.1简单示例2.2多个模板参数2.3模板实例化2.4模板和普通函数同时存在2.5函数模板不支持定义和声明分离3.类模板3.1简单示例3.2成员函数声...
    99+
    2022-11-13
  • C++ pimpl机制详细讲解
    目录什么是PImpl机制为什么用PImpl 机制PImpl实现方法一方法二PImpl 缺点总结源码仓库 什么是PImpl机制 Pointer to implementation(PI...
    99+
    2022-11-13
    C++ pimpl 机制 C++ pimpl模式
  • C++BoostTokenizer使用详细讲解
    目录介绍示例一示例二示例三示例四示例五示例六示例七介绍 库 Boost.Tokenizer 允许您通过将某些字符解释为分隔符来迭代字符串中的部分表达式。使用 boost::token...
    99+
    2022-11-16
    C++ Boost Tokenizer C++ Boost Tokenizer功能与使用
  • C++BoostMPI接口详细讲解
    目录一、说明二、开发和运行时环境三、简单数据交换一、说明 Boost.MPI 提供了 MPI 标准(消息传递接口)的接口。该标准简化了并发执行任务的程序的开发。您可以使用线程或通过共...
    99+
    2022-11-21
    C++ Boost MPI C++ MPI接口
  • C++ Boost Assign超详细讲解
    目录说明Exercise说明 Boost.Assign Boost.Assign 库提供了帮助函数来初始化容器或向容器添加元素。如果需要将许多元素存储在一个容器中,这些函数尤其有用。...
    99+
    2022-12-09
    C++ Boost Assign C++ Assign库
  • C++网络编程详细讲解
    目录一、网络编程二、库示例练习一、网络编程 尽管 Boost.Asio 可以异步处理任何类型的数据,但它主要用于网络编程。这是因为 Boost.Asio 早在添加额外的 I/O 对象...
    99+
    2022-11-13
    C++网络编程 C++网络通信编程
  • C++BoostContainer库示例详细讲解
    目录一、关于Boost.Container二、Boost.Container示例一、关于Boost.Container Boost.Container Boost.Container...
    99+
    2022-11-13
    C++ Boost Container C++ Container库
  • C++详细讲解IO流原理
    目录1. C语言的输入与输出2. 流是什么3. C++IO流4. stringstream的简单介绍1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf (...
    99+
    2022-11-13
  • C++详细讲解图的遍历
    目录图的遍历图的深度优先遍历(DFS, depth first search)图的宽度优先遍历(BFS, breadth first search)宽度优先搜索BFS的应用深度优先遍...
    99+
    2022-11-13
  • C++超详细讲解标准库
    目录一、有趣的重载二、C++ 标准库三、小结一、有趣的重载 操作符 << 的原生意义是按位左移,例:1 <<2; 其意义是将整数 1 按位左移2位,即:000...
    99+
    2022-11-13
  • C++详细讲解引用类型
    目录一、C++中的引用类型二、如何使用C++中的引用类型一、C++中的引用类型 在以严蔚敏老师的《数据结构》为代表的诸多数据结构的书中,都出现了C++引用这一用法,所以在学习数据结构...
    99+
    2022-11-13
  • C++BoostPropertyTree示例超详细讲解
    目录一、提要二、应用示例练习一、提要 借助类 boost::property_tree::ptree,Boost.PropertyTree 提供了一个树结构来存储键/值对。树形结构意...
    99+
    2022-11-13
    C++ Boost PropertyTree C++ Boost PropertyTree示例
  • C++BoostVariant示例超详细讲解
    目录一、提要二、示例一、提要         Boost.Variant 提供了一个类似于 unio&...
    99+
    2022-11-13
    C++ Boost Variant C++ Boost Variant示例
  • C++BoostOptional示例超详细讲解
    目录一、概述二、Boost.Optional一、概述 数据结构类似于容器,因为它们可以存储一个或多个元素。但是,它们与容器不同,因为它们不支持容器通常支持的操作。例如,使用本部分介绍...
    99+
    2022-11-13
    C++ Boost Optional C++ Boost Optional示例
  • C++超详细讲解稀疏矩阵
    目录稀疏矩阵矩阵与稀疏矩阵的定义稀疏矩阵的转置详细思路思路一思路二稀疏矩阵的乘法详细思路稀疏矩阵 矩阵与稀疏矩阵的定义 Q:什么是矩阵 A:数学上,一个矩阵由 m 行 n 列的元素组...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作