后端程序员之路 41、BlockingQueue
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的更多相关文章
- 后端程序员之路 59、go uiprogress
gosuri/uiprogress: A go library to render progress bars in terminal applicationshttps://github.com/g ...
- 后端程序员之路 43、Redis list
Redis数据类型之LIST类型 - Web程序猿 - 博客频道 - CSDN.NEThttp://blog.csdn.net/thinkercode/article/details/46565051 ...
- 后端程序员之路 42、Semaphore
前面学习了Pthreads,了解了线程和线程同步,而同步这个东西,与信号量是密不可分的.下面讨论的主要是Pthreads里的semaphore.h,而不是sys/sem.h [Linux]线程同步之信 ...
- 后端程序员之路 33、Index搜索引擎实现分析2-对外接口和大体流程
# index_manager的单例是index server对外的唯一接口,part_indexer是index搜索的核心部分,index_manager持有了一组part_indexer. typ ...
- 后端程序员之路 22、RESTful API
理解RESTful架构 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/09/restful.html RESTful API 设计指南 - 阮一峰的网络日 ...
- 后端程序员之路 16、信息熵 、决策树、ID3
信息论的熵 - guisu,程序人生. 逆水行舟,不进则退. - 博客频道 - CSDN.NEThttp://blog.csdn.net/hguisu/article/details/27305435 ...
- 后端程序员之路 7、Zookeeper
Zookeeper是hadoop的一个子项目,提供分布式应用程序协调服务. Apache ZooKeeper - Homehttps://zookeeper.apache.org/ zookeeper ...
- 后端程序员之路 4、一种monitor的做法
record_t包含_sum._count._time_stamp._max._min最基础的一条记录,可以用来记录最大值.最小值.计数.总和metric_t含有RECORD_NUM(6)份recor ...
- 后端程序员之路 58、go wlog
daviddengcn/go-colortext: Change the color of console text.https://github.com/daviddengcn/go-colorte ...
随机推荐
- Linux 下mv和cp命令
注意事项:mv与cp的结果不同,mv好像文件"搬家",文件个数并未增加.而cp对文件进行复制,文件个数增加了. 一.cp命令 cp命令用来将一个或多个源文件或者目录复制到指定的目的 ...
- 2019牛客多校 Round2
Solved:2 Rank:136 A Eddy Walker 题意:T个场景 每个场景是一个长度为n的环 从0开始 每次要么向前走要么向后走 求恰好第一次到m点且其他点都到过的概率 每次的答案是前缀 ...
- poj3252 Round Numbers (数位dp)
Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...
- C# 同步和异步(概念理解)
C# 同步和异步 IO 概念区分 四个相关概念: 同步(Synchronous) 异步( Asynchronous) 阻塞( Blocking ) 非阻塞( Nonblocking) 同步异步图解 ...
- Linux-进程管理命令
目录 进程管理命令-ps(静态) 进程管理命令-top(动态) 什么是中断 管理进程状态 kill命令 killall命令 pkill命令 pidof 和 pgrep 补充 关于优先级PR和NI 后台 ...
- servlet相关知识点
一.servlet的生命周期 Servlet(Sever Applet),全称是Java Servlet,是用java编写的服务器程序.Servlet是指任何实现了这个Servlet接口的类. ser ...
- bitbar 网站攻击实验
实验环境 https://github.com/TouwaErioH/security/tree/master/web1 Windows10 Oracle VM VirtualBox Ubuntu16 ...
- win10安装CUDA CUDNN tensorflow-gpu 1.14
#1 安装anaconda 官网下载安装即可.python3.7版本 #2 安装CUDA CUDNN tensorflowgpu1.14 对应CUDNN 7.6.1 CUDA 10.0 注意ten ...
- PAT l2-018 多项式A除以多项式B 【多项式+模拟】
这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出一个非零多项式,先给出A,再给出B.每行的 ...
- Leetcode(11)-盛最多水的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线,使得 ...