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. Codeforces Round #625 Div. 2 D E

    D题:https://codeforces.com/contest/1321/problem/D 题意:题目给个有向图,然后给一段序列,我们要沿着这个序列走,问走的过程中当前点到t的最短路会重构多少次 ...

  2. CSAPP_AttackLab实验报告

    目录 屏幕截图 考察内容 各题答案 level1 level2 level3 level4 level5 解题思路 level1 任务 思路 level2 任务 思路 level3 任务 思路 lev ...

  3. hdu5884 Sort(二分)

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  4. Codeforces Global Round 8 D. AND, OR and square sum(位运算)

    题目链接:https://codeforces.com/contest/1368/problem/D 题意 给出一个大小为 $n$ 的数组 $a$,每次可以选两个下标不同的元素,一个赋为二者相与的值, ...

  5. java中string,stringBuffer和StringBuider

    最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的位置不言而喻,那 ...

  6. Spring应用上下文生命周期

    Spring应用上下文生命周期整体分成四个阶段 ConfigurableApplicationContext#refresh,加载或者刷新持久化配置 ConfigurableApplicationCo ...

  7. element-ui select get selected option object

    element-ui select get selected option object value-key="value" === String :value="{va ...

  8. 你所不知道的 JS: null , undefined, NaN, true==1=="1",false==0=="",null== undefined

    1 1 1 === 全相等(全部相等) ==  值相等(部分相等) demo: var x=0; undefined var y=false; undefined if(x===y){ console ...

  9. Apple WWDC All In One

    Apple WWDC All In One https://developer.apple.com/wwdc20/ https://developer.apple.com/videos/wwdc202 ...

  10. URLSearchParams & shape URL params

    URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams var paramsString = ...