BlockingQueue是muduo是无界队列,利用队列(deque)实现,向队列中加入和取出元素用互斥量和条件变量结合的方式来操作,就是一个线程同步的问题。

BlockingQueue.h

// Use of this source code is governed by a BSD-style license
// that can be found in the License file.
//
// Author: Shuo Chen (chenshuo at chenshuo dot com)#ifndef MUDUO_BASE_BLOCKINGQUEUE_H
#define MUDUO_BASE_BLOCKINGQUEUE_H#include "muduo/base/Condition.h"
#include "muduo/base/Mutex.h"#include <deque>
#include <assert.h>namespace muduo
{
//互斥锁配合条件变量是为了防止线程不停的主动获得锁、检查条件、释放锁、再获得锁、再检查、再释放,一直到满足运行的条件的时候才行
template<typename T>
class BlockingQueue : noncopyable  //无界阻塞队列
{public:BlockingQueue(): mutex_(),notEmpty_(mutex_),   //条件变量queue_(){}void put(const T& x){MutexLockGuard lock(mutex_);queue_.push_back(x);notEmpty_.notify(); // wait morphing saves us// http://www.domaigne.com/blog/computing/condvars-signal-with-mutex-locked-or-not/}void put(T&& x){MutexLockGuard lock(mutex_);queue_.push_back(std::move(x));notEmpty_.notify();//向所有线程提示条件已发生}T take(){MutexLockGuard lock(mutex_);// always use a while-loop, due to spurious wakeupwhile (queue_.empty()){notEmpty_.wait();  //等待条件发生}assert(!queue_.empty());T front(std::move(queue_.front()));//掏空queue_.front(),queue_.front()就变为空了queue_.pop_front();return std::move(front);}size_t size() const{MutexLockGuard lock(mutex_);return queue_.size();}private:mutable MutexLock mutex_;Condition         notEmpty_ GUARDED_BY(mutex_);std::deque<T>     queue_ GUARDED_BY(mutex_);
};}  // namespace muduo#endif  // MUDUO_BASE_BLOCKINGQUEUE_H

muduo之BlockingQueue相关推荐

  1. 15muduo_base库源码分析(六)

    1.BoundedBlockingQueue<T>(有界缓冲区) BoundedBlockingQueue.h // Use of this source code is governed ...

  2. 双缓冲异步日志(Async Logging)

    文章目录 一.日志系统简介 二.功能需求 三.性能需求 四.高效的异步日志 1.异步日志的概念 2.双缓冲异步日志解析 3.AsyncLogging源码 4.代码运行图示 五.双缓冲异步日志的相关问题 ...

  3. muduo BlockingQueue详解

    1. 简介 利用条件变量和std::deque实现阻塞队列 2. 类与接口 插入数据,有2个版本 void put(const T& x) 非常量可以初始化一个底层const,反过来却不行 可 ...

  4. muduo之ThreadPool

    muduo中的线程池. ThreadPool.h // Use of this source code is governed by a BSD-style license // that can b ...

  5. muduo学习笔记 - 第2章 线程同步精要

    第2章 线程同步精要 2.1 互斥器 (mutex) 互斥器保护了临界区,任何时刻最多只能有一个线程在mutex划出的临界区内活动 推荐使用原则: 用RAII手法封装mutex的创建.销毁.加锁.解锁 ...

  6. muduo网络库源码阅读Step by Step

    Posted on: Nov 26 2015 Categories: muduo C++ Tags: muduo 一般写服务端程序都需要有一个称手的网络库来帮我们处理琐碎的网络通信细节,比如连接的建立 ...

  7. Java并发编程之——BlockingQueue(队列)

    一.什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞.被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入 ...

  8. Java中Queue和BlockingQueue的区别

    1.BlockingQueue:支持两个附加操作的 Queue,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用. 2.BlockingQueue 不接受 null 元素. 3 ...

  9. muduo 与 boost asio 吞吐量对比

    muduo (http://code.google.com/p/muduo) 是一个基于 Reactor 模式的 C++ 网络库,我在编写它的时候并没有以高并发高吞吐为主要目标,但出乎我的意料,pin ...

最新文章

  1. python format 格式化函数的用法 格式化字符串(保留小数{:.2f}、数字补零)
  2. html5基础知识点表单
  3. SAP Spartacus logout的拦截
  4. 国内最大“十元店”上市!市值或超百亿美元,腾讯是股东之一
  5. ExecuteNonQuery()方法发即:是指执行非查询SQL命令,如:增、删、改等
  6. Spring boot MultipartResolver
  7. 【博客项目】—项目坏境搭建(一)
  8. Linux0.11系列开篇
  9. 2005年上半年程序员上 下午试题及答案
  10. ASAN Runtime【源码分析】(一)——初始化
  11. LoadBalancer集成Nacos实现负载均衡
  12. Cocos2d之Box2d基础知识
  13. 【Android取证篇】华为手机OTG备份密码重置教程
  14. Obi - Advanced Rope Simulation 绳索插件学习文档
  15. Mac 技巧之苹果电脑 Mac OS X 系统下一键即密码锁定屏幕,防止别人乱用乱看的方法
  16. Python下载与安装,以及下载安装编辑器Geany且通过Geany编辑运行第一个程序Hello world.
  17. 安卓手机变Linux服务器丨AidLux上手体验
  18. 智能车单车组之平衡控制理论分析篇
  19. 杨绛:她和谁都不争,和谁争都不屑
  20. Android开发系统应用程序

热门文章

  1. 【Android 应用开发】Paint 图形组合 Xfermod 简介 ( 图形组合集合描述 | Xfermod 简介 | PorterDuff 简介 )
  2. 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
  3. 团队nabcd(校园大事件)
  4. Leetcode 136 Single Number 仅出现一次的数字
  5. 1642: [Usaco2007 Nov]Milking Time 挤奶时间(dp)
  6. python 获取子目录下的所有文件的路径
  7. Android深度探索HAL与驱动开发—第8章
  8. 从xib 创建 collectionViewCell
  9. Spring AOP中pointcut expression表达式解析
  10. 《大道至简》一书第三版,与编辑就本书写作风格的讨论