美文网首页C++多线程
C++11 实现简单的阻塞队列

C++11 实现简单的阻塞队列

作者: 不动点P | 来源:发表于2020-04-12 15:45 被阅读0次

一个blocking queue是一个支持 take 和 put 的 queue。

take操作从队列中取出一个元素,如果队列为空,那么take会阻塞到直到队列中有可用元素。

put操作往队列里放入一个元素,如果队列是满,那么put会阻塞到队列有可用空间。

一个简单的blocking queue的实现,首先我们要有一个非常底层的容器,至于是vector还是deque甚至是list都无所谓,我们这里选择deque作为容器。

前面定义的blocking queue是有界的,也就是说元素有上限,所以才会出现满元素阻塞的情况。

我们先从简单的无界阻塞队列开始,默认这个队列可以一直存储元素。于是我们就不用去判断队列满元素的情况了。这个时候我们只需要一个条件变量来判断队列为空并且阻塞就行。大概框架如下。

template<typename T>
class BlockQueue{
    std::deque<T> que;
    std::condition_variable empty;
    std::mutex mtx; // declared for unique_lock;
public:
    T take();
    void put(T elem);
    int size();
}

那么核心的take和put要怎么实现呢?

首先修改队列的操作要加锁,并发编程的时候只要涉及到修改可变变量都必须要加锁,不巧put和take都是在修改队列。

这里使用unique_lock来加锁

std::unique_lock<std::mutex> lock{mtx};

两个操作中只有take操作会出现队列为空的情况,所以take必须判断队列为空,这里使用条件变量

empty.wait(lock, [this]{return !que.empty();});

于是我们的put和take操作就出来了

template<typename T>
T BlockQueue::take(){
     std::unique_lock<std::mutex> lock{mtx};
     empty.wait(lock, [this]{return !que.empty();});
     auto res = que.front():
     que.pop_front():
     return res;
}

template<typename T>
void BlockQueue::put(T elem){
     std::unique_lock<std::mutex> lock{mtx};
     que.push_back(T elem);
}

相关文章

  • C++11 实现简单的阻塞队列

    一个blocking queue是一个支持 take 和 put 的 queue。 take操作从队列中取出一个元...

  • 并发编程之并发队列

    常见的并发队列有2种:阻塞队列和非阻塞队列。阻塞队列使用锁实现,非阻塞队列使用CAS非阻塞算法实现。这2种队列都是...

  • 音视频开发之旅(55)-阻塞队列与无锁并发容器

    目录 阻塞队列的定义和使用场景 阻塞的队列的实现原理 简单学习无锁并发容器之ConcurrentLinkedQue...

  • 并发队列-无界非阻塞队列ConcurrentLinkedQueu

    一、 前言 常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一...

  • 多线程之非阻塞队列

    ConcurrentLinkedQueue 相对于阻塞队列加锁实现阻塞,非阻塞队列采用无锁CAS的方式来实现。

  • 阻塞队列--ArrayBlockingQueue

    什么是阻塞队列----阻塞队列概述 ArrayBlockingQueue是一个用数组实现的有界阻塞队列,按先进先出...

  • 线程安全8 - 可阻塞的队列

    队列包含固定长度的队列和不固定长度的队列 什么是阻塞队列,阻塞队列的作用与实际应用,阻塞队列的实现原理 Array...

  • 9.阻塞队列和线程池

    阻塞队列 特性 队列是空的时候,从队列获取元素的操作会被阻塞 队列是满的时候,往队列添加元素的操作会被阻塞 实现 ...

  • 阻塞队列

    原理 当阻塞队列空时,从队列中读取元素操作被阻塞。当阻塞队列满时,从队列中写入元素操作被阻塞。 已经实现的类 Ar...

  • Java队列

    阻塞队列 ArrayBlockingQueue 一个用循环数组实现的有界阻塞队列。必须指定队列长度,按 FIFO(...

网友评论

    本文标题:C++11 实现简单的阻塞队列

    本文链接:https://www.haomeiwen.com/subject/vbtvmhtx.html