BlockingQueue,阻塞队列,常用于实现生产者和消费者模型
特点:
1、队列为空时,取操作会等到队列有数据
2、队列满时,存操作会等到队列可用

基于C++11的阻塞队列简单实现 - Cynric 的博客 - 博客频道 - CSDN.NET
http://blog.csdn.net/cywosp/article/details/9157379

参考java的阻塞队列实现,还可以有以下细节:
1、ArrayBlockingQueue
用数组来存队列里的数据,可以避免用链表时额外的node对象创建销毁开销
2、LinkedBlockingQueue
最常用,队列可以有无限容量,但是生产速度过快会爆掉内存
3、DelayQueue
node只有延迟时间到了才能取到,存操作不会阻塞
4、PriorityBlockingQueue
类似DelayQueue,传入Compator来决定优先级
5、SynchronousQueue
没有缓冲的等待队列

BlockingQueue - - ITeye技术网站
http://wsmajunfeng.iteye.com/blog/1629354

最终实现的简单BlockingQueue:

#include <semaphore.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <list>

template<class T> class BlockingQueue {
public:
    std::list<T> _queue;
    size_t _curr_size;
    pthread_mutex_t _lock;
    sem_t _consumer_sem;
    sem_t _producer_sem;
    int _max_size;

public:
    BlockingQueue(int max_size) {
        pthread_mutex_init(&_lock, NULL);
        sem_init(&_consumer_sem, 0, 0);
        _max_size = max_size;
        _curr_size = 0;
        if (max_size > 0) {
            sem_init(&_producer_sem, 0, max_size);
        }
    }

~BlockingQueue() {
        pthread_mutex_destroy(&_lock);
        sem_destroy(&_consumer_sem);
        if (_max_size > 0) {
            sem_destroy(&_producer_sem);
        }
    }

void push(const T& value) {
        if (_max_size > 0) {
            sem_wait(&_producer_sem);
        }

pthread_mutex_lock(&_lock);
        _queue.push_back(value);
        ++_curr_size;
        sem_post(&_consumer_sem);
        pthread_mutex_unlock(&_lock);
    }

void batch_push(const std::vector<T>& values) {
        for (uint32_t i = 0; i < values.size(); ++i) {
            push( values[i] );
        }
    }
    
    T take() {
        sem_wait(&_consumer_sem);
        pthread_mutex_lock(&_lock);
        T value = _queue.front();
        _queue.pop_front();
        --_curr_size;
        if (_max_size > 0) {
            sem_post(&_producer_sem);
        }
        pthread_mutex_unlock(&_lock);
        return value;
    }

bool try_take(T& out) {
        int ret = sem_trywait(&_consumer_sem);
        if (ret == -1 && errno == EAGAIN) {
            return false;
        }

pthread_mutex_lock(&_lock);
        out = _queue.front();
        _queue.pop_front();
        --_curr_size;
        if (_max_size > 0) {
            sem_post(&_producer_sem);
        }
        pthread_mutex_unlock(&_lock);
        return true;
    }

size_t size() {
        return _curr_size;
    }
};

后端程序员之路 41、BlockingQueue的更多相关文章

  1. 后端程序员之路 59、go uiprogress

    gosuri/uiprogress: A go library to render progress bars in terminal applicationshttps://github.com/g ...

  2. 后端程序员之路 43、Redis list

    Redis数据类型之LIST类型 - Web程序猿 - 博客频道 - CSDN.NEThttp://blog.csdn.net/thinkercode/article/details/46565051 ...

  3. 后端程序员之路 42、Semaphore

    前面学习了Pthreads,了解了线程和线程同步,而同步这个东西,与信号量是密不可分的.下面讨论的主要是Pthreads里的semaphore.h,而不是sys/sem.h [Linux]线程同步之信 ...

  4. 后端程序员之路 33、Index搜索引擎实现分析2-对外接口和大体流程

    # index_manager的单例是index server对外的唯一接口,part_indexer是index搜索的核心部分,index_manager持有了一组part_indexer. typ ...

  5. 后端程序员之路 22、RESTful API

    理解RESTful架构 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/09/restful.html RESTful API 设计指南 - 阮一峰的网络日 ...

  6. 后端程序员之路 16、信息熵 、决策树、ID3

    信息论的熵 - guisu,程序人生. 逆水行舟,不进则退. - 博客频道 - CSDN.NEThttp://blog.csdn.net/hguisu/article/details/27305435 ...

  7. 后端程序员之路 7、Zookeeper

    Zookeeper是hadoop的一个子项目,提供分布式应用程序协调服务. Apache ZooKeeper - Homehttps://zookeeper.apache.org/ zookeeper ...

  8. 后端程序员之路 4、一种monitor的做法

    record_t包含_sum._count._time_stamp._max._min最基础的一条记录,可以用来记录最大值.最小值.计数.总和metric_t含有RECORD_NUM(6)份recor ...

  9. 后端程序员之路 58、go wlog

    daviddengcn/go-colortext: Change the color of console text.https://github.com/daviddengcn/go-colorte ...

随机推荐

  1. LA 3641 Leonardo的笔记本 & UVA 11077 排列统计

    LA 3641 Leonardo的笔记本 题目 给出26个大写字母的置换B,问是否存在要给置换A,使得 \(A^2 = B\) 分析 将A分解为几个循环,可以观察经过乘积运算得到\(A^2\)后,循环 ...

  2. 2019牛客多校第三场D-Big Integer

    题意 定义\(A(n)\) 为 n个1表示的十进制数,例如\(A(3) = 111\) 然后对于\(1 \le i \le n,1\le j \le m\) 问有多少的 \(pairs(i,j)\)满 ...

  3. HDU6403 Card Game【基环树 + 树形DP】

    HDU6403 Card Game 题意: 给出\(N\)张卡片,卡片正反两面都有数字,现在要翻转一些卡片使得所有卡片的正面的值各不相同,问最小翻转次数和最小翻转情况下的不同方案数 \(N\le 10 ...

  4. Windows10与虚拟机中CentOS-7.2进行ftp通信

    首先Linux的IP地址可以通过以下命令获取: ifconfig Windows10上面IP地址通过下面命令获取 ipconfig 你首先要保证你的主机和Linux虚拟机是可以ping通的(ping都 ...

  5. BZOJ4668: 冷战 (并查集 + LCA)

    题意:动态给点连边 询问两个点之间最早是在第几个操作连起来的 题解:因为并查集按秩合并 秩最高是logn的 所以我们可以考虑把秩看作深度 跑LCA #include <bits/stdc++.h ...

  6. 【noi 2.5_8465】马走日(dfs)

    最基本的dfs.这代码理应超时的,我也不知为何AC了......打表我都放弃了,因为最大的数据真的要跑很久...... 1 #include<cstdio> 2 #include<c ...

  7. c语言中qsort函数的使用、编程中的一些错误

    qsort()函数: 功能:相当于c++sort,具有快排的功能,复杂度的话nlog(n)注:C中的qsort()采用的是快排算法,C++的sort()则是改进的快排算法.两者的时间复杂度都是nlog ...

  8. Pyqt5使用

    一.帮助文档 二.PyQt5库结构 三. 面向对象的编程模式 class Windows(QWidget): def __init__(self): #继承父类的QWidget的方法 super(). ...

  9. Nginx location相关配置说明

    Nginx location相关配置说明       基于不同的IP.不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块ngx_http_core_module实现. 新建PC web站点 [ ...

  10. 在QT C++中调用 Python并将软件打包发布(裸机可运行)

    为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件.最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中 ...