返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ Boost Lockfree怎么使用
  • 162
分享到

C++ Boost Lockfree怎么使用

2023-07-04 15:07:31 162人浏览 独家记忆
摘要

本文小编为大家详细介绍“c++ Boost Lockfree怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++ Boost Lockfree怎么使用”文章能帮助大家解决疑惑,下面跟着小编的

本文小编为大家详细介绍“c++ Boost Lockfree怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++ Boost Lockfree怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、说明

Boost.Lockfree 提供线程安全和无容器。可以从多个线程访问此库中的容器,而无需同步访问。

在 1.56.0 版本中,Boost.Lockfree 只提供了两个容器:boost::lockfree::queue 类型的队列和 boost::lockfree::stack 类型的栈。对于队列,可以使用第二个实现:boost::lockfree::spsc_queue。此类针对只有一个线程写入队列和只有一个线程从队列读取的用例进行了优化。类名中的缩写 spsc 代表单一生产者/单一消费者。

二、示例和代码

示例 46.1。使用 boost::lockfree::spsc_queue

#include <boost/lockfree/spsc_queue.hpp>#include <thread>#include <iOStream>boost::lockfree::spsc_queue<int> q{100};int sum = 0;void produce(){  for (int i = 1; i <= 100; ++i)    q.push(i);}void consume(){  int i;  while (q.pop(i))    sum += i;}int main(){  std::thread t1{produce};  std::thread t2{consume};  t1.join();  t2.join();  consume();  std::cout << sum << '\n';}

Example46.1

示例 46.1 使用容器 boost::lockfree::spsc_queue。第一个执行函数 produce() 的线程将数字 1 到 100 添加到容器中。第二个线程执行 consume(),从容器中读取数字并将它们相加。因为容器 boost::lockfree::spsc_queue 明确支持来自两个线程的并发访问,所以不需要同步线程。

请注意,函数 consume() 会在线程终止后被第二次调用。这需要计算所有 100 个数字的总数,即 5050。因为 consume() 在循环中访问队列,它读取数字的速度可能比 produce() 插入数字的速度快。如果队列为空,pop() 返回 false。因此,执行 consume() 的线程可能会终止,因为另一个线程中的 produce() 无法足够快地填充队列。如果执行 produce() 的线程终止,那么很明显所有数字都已添加到队列中。第二次调用 consume() 确保将可能尚未读取的数字添加到 sum 中。

队列的大小被传递给构造函数。因为 boost::lockfree::spsc_queue 是用循环缓冲区实现的,所以示例 46.1 中的队列容量为 100 个元素。如果由于队列已满而无法添加值,则 push() 返回 false。该示例不检查 push() 的返回值,因为恰好有 100 个数字被添加到队列中。因此,100 个元素就足够了。

示例 46.2。 boost::lockfree::spsc_queue 和 boost::lockfree::capacity

#include <boost/lockfree/spsc_queue.hpp>#include <boost/lockfree/policies.hpp>#include <thread>#include <iostream>using namespace boost::lockfree;spsc_queue<int, capacity<100>> q;int sum = 0;void produce(){  for (int i = 1; i <= 100; ++i)    q.push(i);}void consume(){  while (q.consume_one([](int i){ sum += i; }))    ;}int main(){  std::thread t1{produce};  std::thread t2{consume};  t1.join();  t2.join();  q.consume_all([](int i){ sum += i; });  std::cout << sum << '\n';}

Example46.2

示例 46.2 与前面的示例类似,但这次循环缓冲区的大小是在编译时设置的。这是通过模板 boost::lockfree::capacity 完成的,它需要容量作为模板参数。 q 是用默认构造函数实例化的&mdash;&mdash;容量不能在运行时设置。

函数 consume() 已更改为使用 consume_one() 而不是 pop() 来读取数字。 lambda 函数作为参数传递给 consume_one()。 consume_one() 就像 pop() 一样读取一个数字,但该数字不是通过对调用者的引用返回的。它作为唯一参数传递给 lambda 函数。

当线程终止时,main() 调用成员函数 consume_all(),而不是 consume()。 consume_all() 的工作方式与 consume_one() 类似,但要确保队列在调用后为空。只要队列中有元素,consume_all() 就会调用 lambda 函数。

示例 46.2 再次将 5050 写入标准输出。

示例 46.3。具有可变容器大小的 boost::lockfree::queue

#include <boost/lockfree/queue.hpp>#include <thread>#include <atomic>#include <iostream>boost::lockfree::queue<int> q{100};std::atomic<int> sum{0};void produce(){  for (int i = 1; i <= 10000; ++i)    q.push(i);}void consume(){  int i;  while (q.pop(i))    sum += i;}int main(){  std::thread t1{produce};  std::thread t2{consume};  std::thread t3{consume};  t1.join();  t2.join();  t3.join();  consume();  std::cout << sum << '\n';}

Example46.3

示例 46.3 在两个线程中执行 consume()。因为有多个线程从队列中读取,所以不得使用类 boost::lockfree::spsc_queue。此示例改为使用 boost::lockfree::queue。

多亏了 std::atomic,对变量 sum 的访问现在也是线程安全的。

队列的大小设置为 100&mdash;&mdash;这是传递给构造函数的参数。但是,这只是初始大小。默认情况下,boost::lockfree::queue 不使用循环缓冲区实现。如果添加到队列中的项目多于设置的容量,则会自动增加。如果初始大小不够,boost::lockfree::queue 会动态分配额外的内存。

这意味着 boost::lockfree::queue 不一定是无锁的。 boost::lockfree::queue 默认使用的分配器是 boost::lockfree::allocator,它基于 std::allocator。因此,此分配器确定 boost::lockfree::queue 是否是无约束的无锁。

#include <boost/lockfree/queue.hpp>#include <thread>#include <atomic>#include <iostream>using namespace boost::lockfree;queue<int, fixed_sized<true>> q{10000};std::atomic<int> sum{0};void produce(){  for (int i = 1; i <= 10000; ++i)    q.push(i);}void consume(){  int i;  while (q.pop(i))    sum += i;}int main(){  std::thread t1{produce};  std::thread t2{consume};  std::thread t3{consume};  t1.join();  t2.join();  t3.join();  consume();  std::cout << sum << '\n';}

Example46.4

示例 46.3 在两个线程中执行 consume()。因为有多个线程从队列中读取,所以不得使用类 boost::lockfree::spsc_queue。此示例改为使用 boost::lockfree::queue。

多亏了 std::atomic,对变量 sum 的访问现在也是线程安全的。

队列的大小设置为 100&mdash;&mdash;这是传递给构造函数的参数。但是,这只是初始大小。默认情况下,boost::lockfree::queue 不使用循环缓冲区实现。如果添加到队列中的项目多于设置的容量,则会自动增加。如果初始大小不够,boost::lockfree::queue 会动态分配额外的内存。

这意味着 boost::lockfree::queue 不一定是无锁的。 boost::lockfree::queue 默认使用的分配器是 boost::lockfree::allocator,它基于 std::allocator。因此,此分配器确定 boost::lockfree::queue 是否是无约束的无锁。

示例 46.4。具有恒定容器大小的 boost::lockfree::queue

读到这里,这篇“C++ Boost Lockfree怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C++ Boost Lockfree怎么使用

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

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

猜你喜欢
  • C++ Boost Lockfree怎么使用
    本文小编为大家详细介绍“C++ Boost Lockfree怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++ Boost Lockfree怎么使用”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-07-04
  • C++ Boost Lockfree怎么使用
    要使用C++ Boost Lockfree,您可以按照以下步骤操作:1. 安装Boost库:首先,您需要在您的计算机上安装Boost...
    99+
    2023-08-17
    C++
  • C++ Boost Lockfree超详细讲解使用方法
    Boost Lockfree 是一个基于 C++ 的库,用于实现无锁的数据结构和算法。无锁的数据结构和算法是为了解决并发编程中的竞争...
    99+
    2023-08-16
    C++
  • C++的Boost Bimap怎么使用
    这篇文章主要介绍了C++的Boost Bimap怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++的Boost Bimap怎么使用文章都会有所收获,下面我们一起来看看吧。一、提要库...
    99+
    2023-07-04
  • C++ Boost Array与Unordered怎么使用
    这篇文章主要介绍“C++ Boost Array与Unordered怎么使用”,在日常操作中,相信很多人在C++ Boost Array与Unordered怎么使用问题上存在疑惑,小编查阅了各式资料,...
    99+
    2023-07-04
  • C++ Boost MPI接口怎么应用
    这篇“C++ Boost MPI接口怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++&nbs...
    99+
    2023-07-04
  • C++的Boost MultiIndex如何使用
    今天小编给大家分享一下C++的Boost MultiIndex如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-07-04
  • C++中Boost的智能指针scoped_ptr怎么使用
    本篇内容主要讲解“C++中Boost的智能指针scoped_ptr怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中Boost的智能指针scoped_ptr怎么使用”吧!boost:...
    99+
    2023-07-02
  • Boost库怎么用
    这篇文章给大家分享的是有关Boost库怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了*...
    99+
    2023-06-17
  • C++使用boost::lexical_cast进行数值转换
    在STL库中,我们可以通过stringstream来实现字符串和数字间的转换: int i = 0; stringstream ss; ss <<...
    99+
    2024-04-02
  • C++ Boost MultiArray简化使用多维数组库
    目录一、介绍Boost.MultiArray二、示例一、介绍Boost.MultiArray Boost.MultiArray Boost.MultiArray 是一个简化使用多维数...
    99+
    2022-11-13
    C++ Boost MultiArray C++ Boost MultiArray库 C++ 多维数组简化
  • boost字符串处理函数format怎么使用
    这篇文章主要介绍“boost字符串处理函数format怎么使用”,在日常操作中,相信很多人在boost字符串处理函数format怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”boost字符串处理函数f...
    99+
    2023-07-02
  • C++win系统如何用MinGW编译Boost库
    目录1、下载2、编译链接库1)创建三个独立文件夹2)安装Boost.Build3)编译链接库4) 删除3、链接库测试总结在win端如果使用非VS编译器,则需要使用Boost.Buil...
    99+
    2022-12-15
    C++ MinGW编译Boost库 MinGW编译Boost库 MinGW编译Boost
  • Linux下怎么安装boost 1.69库
    这篇文章主要介绍了Linux下怎么安装boost 1.69库的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux下怎么安装boost 1.69库文章都会有所收获,下面我们一起来看看吧。Boost库是为C++...
    99+
    2023-06-27
  • Linux系统怎么编译Boost库
    这篇文章的内容主要围绕Linux系统怎么编译Boost库进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!Boost库简介:Boost库是为C++语言标...
    99+
    2023-06-28
  • C++/C中#define怎么使用
    本篇内容介绍了“C++/C中#define怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 缩减代码 第一种用法与type...
    99+
    2023-07-02
  • C++类怎么使用
    本篇内容介绍了“C++类怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下面用实际的案例来说明C++类概念的问题,在世界中,经常有属于...
    99+
    2023-06-17
  • C# AssemblyInfo.cs怎么使用
    C# AssemblyInfo.cs 文件用于指定程序集的相关信息,包括版本号、作者、版权信息等。下面是使用 AssemblyInf...
    99+
    2023-09-26
    C#
  • c++ thread怎么使用
    C++中的线程可以通过使用std::thread类来创建和管理。下面是一个简单的示例代码,展示了如何在C++中使用线程:```cpp...
    99+
    2023-09-15
    c++
  • c++ SuspendThread怎么使用
    在C++中,可以使用`SuspendThread`函数来暂停一个线程。该函数的原型如下:```cppDWORD WINAPI Sus...
    99+
    2023-09-15
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作