C++11 中的并发阻塞队列

2024-04-03

对于线程之间传递的消息,我正在寻找具有以下属性的并发队列:

  • 有界尺寸
  • pop 方法会阻塞/等待直到元素可用。
  • abort 方法取消等待
  • 可选:优先

多个生产者,一个消费者。

The concurrent_bounded_queueTBB 会提供这一点,但我正在寻找替代方案来避免 TBB 的额外依赖性。

该应用程序使用 C++11 和 boost。我在 boost 中找不到任何合适的东西。有什么选择?


使用 Boost 库(circular_buffer)和 C++11 标准库的简单实现。

#include <mutex>
#include <condition_variable>
#include <boost/circular_buffer.hpp>

struct operation_aborted {};

template <class T, std::size_t N>
class bound_queue {
public:
  typedef T value_type;
  bound_queue() : q_(N), aborted_(false) {}
  void push(value_type data)
  {
    std::unique_lock<std::mutex> lk(mtx_);
    cv_pop_.wait(lk, [=]{ return !q_.full() || aborted_; });
    if (aborted_) throw operation_aborted();
    q_.push_back(data);
    cv_push_.notify_one();
  }
  value_type pop()
  {
    std::unique_lock<std::mutex> lk(mtx_);
    cv_push_.wait(lk, [=]{ return !q_.empty() || aborted_; });
    if (aborted_) throw operation_aborted();
    value_type result = q_.front();
    q_.pop_front();
    cv_pop_.notify_one();
    return result;
  }
  void abort()
  {
    std::lock_guard<std::mutex> lk(mtx_);
    aborted_ = true;
    cv_pop_.notify_all();
    cv_push_.notify_all(); 
  }
private:
  boost::circular_buffer<value_type> q_;
  bool aborted_;
  std::mutex mtx_;
  std::condition_variable cv_push_;
  std::condition_variable cv_pop_;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 中的并发阻塞队列 的相关文章

  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • Guzzle 中的“并发”到底是什么?

    我没有找到太多关于concurrency选项中Pool 如果这是可以在服务器上打开的 TCP 套接字数量 那么问题是 我可以使用多少并发来更快地处理请求 我有这个使用的例子Pool I am using Laravel this is ba
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 为什么 std::queue 使用 std::dequeue 作为底层默认容器?

    继续阅读cplusplus com http www cplusplus com reference queue queue std queue实现如下 队列被实现为容器适配器 这些类 使用特定容器类的封装对象作为其 底层容器 提供一组特定
  • 枚举类默认初始化

    枚举类的默认初始化 构造是否已定义行为 这是一个最小的例子 在线尝试 https coliru stacked crooked com a d3091f82e33f5b42 enum class ALPHA X 0 Y 1 Z 2 int
  • 在编译时使用 Constexpr 填充数组

    我想使用 constexpr 填充枚举数组 数组的内容遵循一定的模式 我有一个枚举 将 ASCII 字符集分为四类 enum Type Alphabet Number Symbol Other constexpr Type table 12
  • 从空缓冲区构造“std::ostream”是否有效?

    考虑以下 std ostream out nullptr 这是合法且明确定义的吗 如果我现在这样做怎么样 out lt lt hello world n 这是合法且明确定义的吗 如果是这样 大概这是一种无操作 是的 实例化该流是合法且定义明
  • 将 N 种类型的参数包折叠成 N-1 对

    我正在尝试折叠参数包N不同类型分为std tuple of N 1 std pairs与各自的类型 例如表达式 ResolveToTupleOfPairs
  • Laravel - 停止并发访问记录

    在 Laravel 中 有什么方法可以停止同时与同一条记录交互 例如 如果用户 A 正在编辑一条记录 那么我同时需要阻止用户 B 编辑同一条记录 注意 我在 Laravel 5 2 中使用 SESSION DRIVER file 目前大约有
  • 保证静态对象的静态(常量)初始化

    最重要的问题是 程序员如何确保他的非局部静态变量是通过静态初始化而不是通过动态初始化来初始化的 由于总是进行零初始化 因此应该查看常量初始化 3 6 2 2 对象 o 的常量初始值设定项是一个常量表达式 只不过它也可以调用 constexp
  • 函数模板和非推导上下文的部分排序在 MSVC 2017 中不起作用

    The identitytemplate 是一种常见的习惯用法 用于关闭某个 依赖的 模板参数的推导 例如允许隐式转换 如下例所示 include
  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • 通过右值数据成员延长临时的生命周期适用于聚合,但不适用于构造函数,为什么?

    我发现以下方案可以延长临时生命周期 我不知道是否应该 但确实如此 struct S std vector
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • C++ 中带有可变参数签名的函数映射

    From Martin Reddy 的 C API 设计 第 3 章 第 3 3 3 节 可扩展工厂示例 我发现工厂模式的这种实现非常高效 它允许用户在运行时注册回调函数 本质上是派生类的构造函数 最终可以在创建该类型的对象时调用该回调函数
  • C++11 Geany 设置

    我正在学习 C 我需要在 Geany 中为 C 11 正确设置编译和构建命令 我以为我的理解是正确的 但是当使用时auto 我收到以下错误 warning auto will change meaning in C 0x please re
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • Linux 上哪个版本的 C++ 库符合“ISO C++ 11”标准?

    目前我的计算机上有 Debian Squeeze AMD64 linux libstdc 5 和 libstdc 6 这些 C 库符合 ISO 标准 C 11 吗 不 它们并不完全符合 但它们有一些元素 stdlibc 上的 C 11 支持
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht

随机推荐

  • 在 AngularJS 中使用逗号作为列表分隔符

    我需要创建一个以逗号分隔的项目列表 li b email last b li 根据 AngularJS 文档 表达式中不允许使用控制流语句 这就是为什么我的 last 不起作用 是否有其他方法来创建逗号分隔的列表 EDIT 1有没有比以下更
  • SQLite 并插入 UTC 格式的当前日期

    如何在 sqlite 数据库上使用 SQL 语句插入 UTC 格式的当前日期 我找到了NOW函数 但它的格式是什么 这将在移动设备上进行 因此每个人都会有不同的区域设置 但是 我需要标准时间格式 因为设备会将日期与我的服务器进行比较 另外
  • Python - DM 用户 Discord 机器人

    我正在 Python 中开发一个 User Discord 机器人 如果机器人所有者输入 DM user然后机器人会私信所有者提到的用户 client event async def on message message if messag
  • 是否可以在同一个 html 页面中多次使用相对位置?

    我在主页上使用 相对位置 和 绝对位置 我有一个使用上述母版页的页面 并且我尝试在此页面中再次对其他 2 个元素使用 相对位置 和 绝对位置 但该页面中下面的元素 绝对位置 是不是根据其上方的元素放置的 相对位置 而是指母版页中元素的 相对
  • 如何在 JavaFX 中将 GUI 覆盖到 3D 场景上?

    我在 JavaFX 中有一个 3D 场景 需要在 3D 场景上覆盖 GUI 我尝试向场景添加按钮和文本 但它们始终作为 3D 对象出现在 3D 视图中 我环顾四周 没有找到该怎么做 唯一的解决方法是创建一个全新的窗口并将设置放在那里 但在这
  • Android Facebook - 获取空个人资料

    第一次使用 Facebook SDK 我无法获取用户个人资料 它始终为空 怎么了 btnFbWidget LoginButton findViewById R id btnFbWidget btnFbWidget setReadPermis
  • 删除indexedDB对象存储中特定索引值的所有记录

    对于数组键为的对象存储 a b where a也是一个索引 有没有更有效的方法来删除特定值的所有记录a而不是在索引上打开游标a并通过光标逐步删除每条记录 有没有办法只为索引定义键范围 或者只为索引定义键范围a然后离开b打开任何值 以便可以删
  • 如何在 AngularJS 和 Jasmine 中对 $http 进行单元测试

    这是我的代码 因为代码很长 所以我做了一个 Plunker describe create function it Should be defined function expect BaseService create toBeDefin
  • 导入特定于版本的 python 模块的最佳方法

    对于在特定于版本的 python 中导入模块 哪种方法最有意义 我的用例是 我正在编写将部署到 python 2 3 环境中的代码 并在几个月内升级到 python 2 5 这 if sys version info 2 gt 2 5 fr
  • 复制到剪贴板需要花费大量时间

    我有以下代码将 25MB 的数据复制到剪贴板 star time after populating HTML and Text const start time new Date getTime navigator clipboard wr
  • Applescript 将启动 Chrome(具体内容)

    我真的很难创建一些在 osx 上启动浏览器窗口 chrome 的方法 具体细节包括窗口大小 没有选项卡等 传统上 我通过带有 IE 的窗口使用 vb 脚本 这是一个非常简单的练习 但我 我将是第一个承认的人 当谈到 Mac 时 我感到非常挣
  • Rails 3 ActiveRecord .skip_callback 线程安全

    这段代码线程安全吗 MyModel skip callback save before my callback my model instance update attributes attributes MyModel set callb
  • 错误:(9, 5) 错误:找不到资源 android:attr/dialogCornerRadius

    所以我安装了 android studio 3 0 1 一旦打开构建的 gradle 并显示以下错误 我尝试添加设计和支持等依赖项 但徒劳无功 有人可以帮助我吗 它显示了一些属性 例如dialogCornerRadius and fontV
  • 将字符串转换为代码隐藏中的可执行 C# 代码[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 4 0 中执行字符串 https stackoverflow com questions 760088 execute a string in c sharp 4 0 我怎样才能让这个字符串执
  • 使用 Cocoa 获取当前播放的歌曲

    有没有一种方法 当然有一种方法 但哪种方法 以编程方式获取 Mac OS 10 5 8 和 OS 10 6 上 iTunes 中当前播放的歌曲的信息 我的 Cocoa 应用程序需要这个 我使用 iTunes 8 和 Objective C
  • 是否可以使用 AndroidAnnotations 注入模拟以进行测试?

    我还没有找到任何关于如何执行此操作的示例 我假设基于这样的例子这是不可能的 Bean MyImplementation class MyInterface myInterface 其中要注入的类已经确定 的补充johncarl answer
  • 在线视频流

    我想制作一个视频网站 我们可以在其中上传任何格式的视频并像 youtube 一样显示 我怎样才能做到这一点 我的整个网站都是用 PHP 编写的 我是视频流 SP 的新手 请描述一下您的答案 Thanks 首先你需要一个用Flash Acti
  • 如何在 SWIFT 3 中将 HTTPS 代理添加到 NSURLSession

    我使用以下代码连接到代理服务器 并且仅适用于 HTTP 请求 但不适用于 HTTPS 在 iOS 9 0 中 kCFStreamPropertyHTTPSProxyHost and kCFStreamPropertyHTTPSProxyPo
  • 为什么运行hadoop时数据节点会关闭?

    我在 VirtualBox 的 ubuntu 11 0 4 上安装了 hadoop 1 0 4 与我的主机名相同 不知何故数据节点关闭 在日志文件中出现以下错误 STARTUP MSG Starting DataNode STARTUP M
  • C++11 中的并发阻塞队列

    对于线程之间传递的消息 我正在寻找具有以下属性的并发队列 有界尺寸 pop 方法会阻塞 等待直到元素可用 abort 方法取消等待 可选 优先 多个生产者 一个消费者 The concurrent bounded queueTBB 会提供这