c++ 实现 blocking queue

c++ 实现BlockingQueue 1、BlockingQueue类 #include "thread/Critical.h" #include "thread/Codition.h" #include "thread/Lock.h" #include using namespace std; const unsigned int DEFAULT_MAX_SIZE = 100; template class Blocking 阅读详情

阻塞队列就是多线程线程安全的队列,在多线程场景下经常用到,c++ 标准库里面没有提供阻塞队列,boost 中有提供,生成环境下可以使用

blocking queue 实现

主要设计思路:

  1. 使用 std::vector 实现一个环形队列,使用两个指针 start 和 end 来标识起止位置,push 的时候在 end 处插入,pop 的时候直接 start 指针往后移即可
  2. 使用 std::condition_variable 实现同步,push 的时候需要满足 _not_full 条件,push 完成发送 _not_empty 通知,pop 的时候需要满足 _not_empty 条件,pop 完成发送 _not_full 通知
template <typename T>
class BlockingQueue {
    std::mutex              _mutex;
    std::condition_variable _not_full;
    std::condition_variable _not_empty;
    int                     _start;
    int                     _end;
    int                     _capacity;
    std::vector<T>          _vt;

   public:
    BlockingQueue(const BlockingQueue<T>& other) = delete;
    BlockingQueue<T>& operator=(const BlockingQueue<T>& other) = 
C++并发实战:面试题4:生产者消费者试题blocking queue 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装 阅读详情

相关推荐

Disruptor-cpp:C++高性能内存队列实现原理与实战应用

在并发编程领域,线程间高效、低延迟的数据交换是核心挑战。传统队列常因锁竞争、内存分配和缓存失效成为性能瓶颈。其原理在于通过预分配内存、序号驱动和避免伪共享等设计,将数据交换的延迟和吞吐量优化到极致。这项技术的价值在于为金融交易、实时风控、游戏服务器等对性能有严苛要求的场景提供了可预测的高性能解决方案。Disruptor-cpp作为该范式的C++实现,通过利用C++11原子操作和缓存行填充等技术,让开发者能够在C++生态中构建超低延迟的生产者-消费者系统,例如实现高吞吐的行情分发或订单处理引擎。

weixin_33698823的博客 542

多线程/C++】阻塞队列的C++多线程 实现 BlockingQueue

阻塞队列实现: 当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素; 当队列满时,有两种方案: 方案1: 往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出或者删除。 具体方法:定义一个条件变量std::condition_variable not_full_;在存放操作时,判断队列为满时,使用not_full_.wait(lock)阻塞线程;当进行删除队列元素的操作后,就使用not_full_.notify_all()来唤醒not_full_.wait(lock)

u011754972的博客 3409

[C++11] 线程安全的BoundedBlockingQueue

template &lt;typename T&gt; class BoundedBlockingQueue { public: explicit BoundedBlockingQueue(int maxSize) : ringbuffer(maxSize) { } void put(const T&amp; x) { std::unique_lock&...

sai_j的博客 1060

BlockingQueue(阻塞队列)详解

BlockingQueue

恬静释然的博客 1057

C++11 线程安全的BlockingQueue实现

C++11 BlockingQueue

大黄鸭 8188

C++ 实现一个简易的阻塞队列

阻塞队列是多线程中常用的数据结构,对于实现多线程之间的数据交换、同步等有很大作用。 阻塞队列常用于生产者消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列是生产者用来存放元素、消费者获取元素的容器。 考虑下,这样一个多线程模型,程序有一个主线程 master 和一些 worker 线程,master 线程负责接收到数据,给 worker 线程分配数据,worker 线程取得一个任务后便可以开始工作,如果没有任务便阻塞住,节约 cpu 资源。 master 线程

ChaoQun 2458

线程安全队列 java_C++ 如何用百行代码实现线程安全的并发队列 | concurrent queue or blocking queue implemented in cpp...

concurrent queue or blocking queue implemented in cppGuideintroductionWhere produce-consumer pattern is present it is often the case that one is faster that the other:a parsing producer reads records ...

weixin_39733812的博客 164

c++ blocking queue 实现

https://www.cnblogs.com/hatlonely/p/11945451.html

digitaluser的博客 260

C 如何用百行代码实现线程安全的并发队列 | concurrent queue or blocking queue implemented in cpp

本文首发于个人博客https://kezunlin.me/post/cabccf5c/,欢迎阅读最新内容! concurrent queue or blocking queue implemented in cpp Guide introduction Where produce-consumer pattern is present it is often the case that one ...

KeZunLin's blog 1030

<simple,fast,and practical non-blocking and blocking concurrent Queue Aligorithms>的fifo Queue实现

Maged M. Michael和Michael L. Scott于1996年发表的论文。最有价值的部分是完善了Valois于1995年论文中实现的lock-free fifo queue。从之前的分析可知,Valois的实现存在的问题是Tail指针可能在很长一段时间内都没有指向真正的last node。 Scott在Introduction中详细描述了Valois的问题: Unfortunately, the algorithm allows the tail pointer to lag behin

liangll的博客 711

[C++11] 线程安全的BlockingQueue

参照muduo中的源码,使用C++11语法进行改写 #include &lt;mutex&gt; #include &lt;condition_variable&gt; #include &lt;deque&gt; template &lt;typename T&gt; class BlockingQueue { public: BlockingQueue() : mutex_(), c...

sai_j的博客 1126

【Leetcode】1188. Design Bounded Blocking Queue

用两个条件变量,和一把锁,两个条件变量一个负责阻塞和唤醒入队线程,另一个负责阻塞和唤醒出队线程。我们不希望入队和出队同时进行,所以需要用同一把锁。当入队的时候,首先上锁(不让出队线程进行),然后等待队列不满,如果不满则入队,并且唤醒出队线程(如果当前有出队线程wait的话,其就会被唤醒做出队操作);当出队的时候,类似的,首先上锁,然后等待队列不空,如果不空则出队,并唤醒入队线程(如果当前有入队线程wait的话)。如果出队的时候队列为空,则阻塞住该线程;如果入队的时候队列的大小已经达到了。

数学、算法爱好者的博客 514

caffe里的blocking_queue.hpp与.cpp干了点什么呢???

我看的一下午才明白的,因为吧,我之前都是不知道与boost::thread相关的任何知识,然后开始看各种资料啊。。。 妈的,我就是一个小白,没一点基础的。。   总的来说:blocking_queue实现一个阻塞队列,它利用了生成者与消费者的设计模式,怎么说呢?、 首先吧,你要有一个queue(队列,c++里的一种容器),对它的操作有push与pop。 push即向队列里压入数据,相当于一个生产者...

weixin_34248118的博客 122

一个C++基于boost简单实现的线程池

为什么80%的码农都做不了架构师?>>> ...

weixin_34304013的博客 306

轻量级信号量实现:moodycamel::ConcurrentQueueBlocking版本底层原理

多线程编程中,生产者-消费者模型是一种常见的并发模式。传统的锁机制虽然能解决线程同步问题,但往往伴随着性能瓶颈。本文将深入剖析[moodycamel::ConcurrentQueue](https://link.gitcode.com/i/85070c1736c44be2d0f0e71513dae5bf)的阻塞版本实现,重点解读其底层轻量级信号量(Semaphore)的工作原理,以及如何通过信号...

gitblog_00427的博客 368

梳理caffe代码blocking_queue(十)

这一个文件基本是我们最头疼的黑色地带,关于XXXX锁,XXXX解锁的问题,遇到的了学习学习,记不住多温习几次就可以。 首先抛开那些官方的条条框框,我们为了不让多个线程同时访问共享的资源是至关重要的。假如一个线程试图改变共享数据的值,而另外一个线程试图去读取该共享数据的值,结果将是未定义的。为了阻止这样的事情发生,需要用到一些非凡的原始数据类型和操作。其中最重的一个就是总所周知的mutex(“mu

深藏功与名 3456

如何快速实现C++高性能并发:ReaderWriterQueue无锁队列终极指南

ReaderWriterQueue是一个面向C++开发者的高性能单生产者-单消费者无锁队列库,专为解决并发编程中的数据传递问题而设计。它采用无锁设计,避免了传统锁机制带来的性能开销,让多线程数据交换变得简单高效。 ## 🚀 为什么选择无锁队列? 在多线程编程中,传统的互斥锁机制虽然简单可靠,但会带来上下文切换和线程阻塞的性能损耗。ReaderWriterQueue通过精妙的无锁算法,实现了:

gitblog_00407的博客 1111
上一篇: golang 反射
下一篇: mysql 事务
hatlonely
博客等级 码龄14年 24粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值