Muduo库源码分析(6):有界缓冲区,无界缓冲区
来源:互联网 发布:佛山楼市每日成交数据 编辑:程序博客网 时间:2024/05/21 11:22
- 缓冲区的实现
类似于生产者消费者模型,往缓冲区添加任务相当于生产者,从缓冲区提取任务相当于消费者,Muduo库使用条件变量加互斥锁实现的有界和无界缓冲区
简易的条件变量加互斥锁实现的生产者消费者模型(无界)实现:
http://blog.csdn.net/zjf280441589/article/details/43883113
有界缓冲区
class BoundedBlockingQueue : noncopyable{ public: explicit BoundedBlockingQueue(int maxSize) : mutex_(), notEmpty_(mutex_), notFull_(mutex_), queue_(maxSize) { } void put(const T& x) { MutexLockGuard lock(mutex_); while (queue_.full()) { notFull_.wait(); } assert(!queue_.full()); queue_.push_back(x); notEmpty_.notify(); } T take() { MutexLockGuard lock(mutex_); while (queue_.empty()) { notEmpty_.wait(); } assert(!queue_.empty()); T front(queue_.front()); queue_.pop_front(); notFull_.notify(); return front; } bool empty() const { MutexLockGuard lock(mutex_); return queue_.empty(); } bool full() const { MutexLockGuard lock(mutex_); return queue_.full(); } size_t size() const { MutexLockGuard lock(mutex_); return queue_.size(); } size_t capacity() const { MutexLockGuard lock(mutex_); return queue_.capacity(); } private: mutable MutexLock mutex_;// 互斥量 Condition notEmpty_;// 条件变量表明可消费的数量 Condition notFull_;// 条件变量表明可生产的数量 circular_buffer<T> queue_;// 环形缓冲区};
无界缓冲区
class BlockingQueue : noncopyable{ public: BlockingQueue() : mutex_(), notEmpty_(mutex_), queue_() { } void put(const T& x) { MutexLockGuard lock(mutex_); queue_.push_back(x); notEmpty_.notify(); } void put(T&& x) { MutexLockGuard lock(mutex_); queue_.push_back(std::move(x)); notEmpty_.notify(); } T take() { MutexLockGuard lock(mutex_); while (queue_.empty()) { notEmpty_.wait(); } assert(!queue_.empty()); T front(std::move(queue_.front())); queue_.pop_front(); return front; } size_t size() const { MutexLockGuard lock(mutex_); return queue_.size(); } private: mutable MutexLock mutex_;// 互斥量 Condition notEmpty_;// 条件变量表明可消费的数量 std::deque<T> queue_;// 队列};
阅读全文
0 0
- Muduo库源码分析(6):有界缓冲区,无界缓冲区
- muduo源码分析:无界队列和有界队列(消费者-生产者)
- 有界缓冲区问题
- muduo网络库源码学习————无界队列和有界队列
- Netty5源码分析(五) -- ByteBuf缓冲区
- muduo库源码分析
- suricata 源码分析之ringbuffer(环形缓冲区)
- muduo库阅读(15)——日志流类、固定大小缓冲区类
- muduo库阅读(23)——Net部分:应用层缓冲区类
- muduo网络库学习(六)缓冲区Buffer及TcpConnection的读写操作
- Android图形缓冲区分配过程源码分析
- Android图形缓冲区映射过程源码分析
- Android图形缓冲区映射过程源码分析
- Android图形缓冲区映射过程源码分析
- muduo——有界队列和无界队列
- 缓冲区
- 缓冲区
- 缓冲区
- js的call和bind等原型方法的简单实现
- C++中的类模板详细讲述
- Android学习日记(1)
- SpringBoot日志logback的使用
- Android学习日记(1)
- Muduo库源码分析(6):有界缓冲区,无界缓冲区
- android核心机制之Zygote启动流程
- Hibernate(十三)缓存
- php中间件的一些介绍
- Android左右连接和USING
- CC2640R2F BLE5.0 CC2640R2F/BLE5.0 距离测试
- POJ2155-二维树状数组-Matrix
- Linux下的IDE环境
- Android屏幕适配px和dp适配两种方式