C++ Boost Atomic详细讲解

 更新时间:2022年11月20日 14:23:59   作者:无水先生  
Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称

一、说明

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • return和break的区别解析

    return和break的区别解析

    这篇文章主要介绍了return和break的区别解析,需要的朋友可以参考下
    2014-02-02
  • C语言strcpy库函数详解

    C语言strcpy库函数详解

    这篇文章主要为大家介绍了C语言strcpy库函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • QT已有项目导入工程时注意事项图文详解

    QT已有项目导入工程时注意事项图文详解

    QT开发这几年大大小小项目做了不少,花了点时间对知识点总结整合了一部分,下面这篇文章主要给大家介绍了关于QT已有项目导入工程时注意事项的相关资料,需要的朋友可以参考下
    2023-11-11
  • Qt跨平台窗口选择功能的实现过程

    Qt跨平台窗口选择功能的实现过程

    很多时候为了方便软件的使用,我们需要让编写的界面程序显示在最上层,这时候就需要对窗口属性进行调整,下面这篇文章主要给大家介绍了关于Qt跨平台窗口选择功能的实现过程,需要的朋友可以参考下
    2022-12-12
  • C++输入输出操作符重载的深入分析

    C++输入输出操作符重载的深入分析

    本篇文章是对C++输入输出操作符重载进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C数据结构中串简单实例

    C数据结构中串简单实例

    这篇文章主要介绍了C数据结构中串简单实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • 浅析C++函数模板和类模板

    浅析C++函数模板和类模板

    C++语言的模板技术包括函数模板和类模板,模板技术是一种代码重用技术,函数和类是C++语言中两种主要的重用代码形式,这篇文章主要介绍了C++函数模板和类模板,需要的朋友可以参考下
    2022-07-07
  • C++利用随机策略实现优化二叉树操作效率

    C++利用随机策略实现优化二叉树操作效率

    这篇文章中我们主要来详细探讨随机化二叉搜索树的基本思想、实现方法,以及如何在C++中应用这些策略来优化我们的数据结构,感兴趣的可以了解下
    2024-02-02
  • C++中vector容器的用法

    C++中vector容器的用法

    在c++中,vector是一个十分有用的容器。这篇文章主要介绍了C++ vector容器的用法的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • C/C++读取配置文件的方式小结

    C/C++读取配置文件的方式小结

    这篇文章主要为大家详细介绍了C/C++中读取配置文件的几种常见方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04

最新评论