muduo库的BlockingQueue和BoundBlockingQueue类剖析

Muduo里的blockingQueue实现线程池伪码 #include #include #include #include #include template class BlockingQueue : boost::noncopyable { public: BlockingQueue(): mutex_(),notEmpty_(mutex_),queue_(){} void put(const T& x) { 阅读详情


一:无界阻塞队列


muduo库的BlcokingQueue实际上用的生产这消费者模型。我们知道生产者消费者模型一般有两种实现方式,可以利用信号量也可以利用条件变量实现,muduo库采用条件变量实现。

BlockingQueue比较简单,它是线程安全的,我们在外部调用它时无需加锁。


它的类图如下:



实现代码如下:

#ifndef MUDUO_BASE_BLOCKINGQUEUE_H
#define MUDUO_BASE_BLOCKINGQUEUE_H

#include <muduo/base/Condition.h>
#include <muduo/base/Mutex.h>

#include <boost/noncopyable.hpp>
#include <deque>
#include <assert.h>

namespace muduo
{

template<typename T>
class BlockingQueue : boost::noncopyable
{
 public:
  BlockingQueue()
    : mutex_(),
      notEmpty_(mutex_),
      queue_()    //使用deque
  {
  }

  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/
  }

#ifdef __GXX_EXPERIMENTAL_CXX0X__
  void put(T&& x)
  {
    MutexLockGuard lock(mutex_);
    queue_.push_back(std::move(x));
    notEmpty_.notify();
  }
  // FIXME: emplace()
#endif

  T take()    //取任务
  {
    MutexLockGuard lock(mutex_);     //取任务时也要保证线程安全
    // always use a while-loop, due to spurious wakeup
    while (queue_.empty())    //如果为空就阻塞在这里啦,用while循环不必多说
    {
      notEmpty_.wait();
    }
    assert(!queue_.empty());    //确保队列不空
#ifdef __GXX_EXPERIMENTAL_CXX0X__
    T front(std::move(queue_.front()));
#else
    T front(queue_.front());   //取出队头
#endif
    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_;
};

}

#endif  // MUDUO_BASE_BLOCKINGQUEUE_H


二:有界阻塞队列

BoundBlockingQueue有界阻塞队列,实际上就是实现了一个循环队列。功能和上面的BlockingQueue都是一样的。

它的类图如下:



muduo库实现该队列实际上是内部把boost::circular_buffer类作为底层数据结构实现的。

实现:
#ifndef MUDUO_BASE_BOUNDEDBLOCKINGQUEUE_H
#define MUDUO_BASE_BOUNDEDBLOCKINGQUEUE_H

#include <muduo/base/Condition.h>
#include <muduo/base/Mutex.h>

#include <boost/circular_buffer.hpp>
#include <boost/noncopyable.hpp>
#include <assert.h>

namespace muduo
{

template<typename T>
class BoundedBlockingQueue : boost::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_;
  boost::circular_buffer<T>  queue_;      //使用boost的环形缓冲区
};

}

#endif  // MUDUO_BASE_BOUNDEDBLOCKINGQUEUE_H

所以说这两个阻塞队列其实没啥区别,只是底层采用不同数据结构存储数据而已。




muduo网络库使用心得 上个月看了朋友推荐的mudo网络库,下完代码得知是国内同行的开源作品,甚是敬佩。下了mudo使用手册和035版的代码看了下结构,感觉是一个比较成熟而且方便使用的网络库。本人手头也有自己的网络库,虽然不敢说是一个多强大的网络库,但毕竟在外网也稳定运营了几年,多组同时在线也跑过30w左右,单组服务器也能跑上w人。做游戏服务器几年的经验,感觉稳定性才是网游服务器最核心最重要的环节,效率还在其次,这也是目 阅读详情

相关推荐

Cadence Sigrity PowerDC实战:如何用PCB电热混合仿真解决散热难题(附详细配置步骤)

本文详细介绍了如何利用Cadence Sigrity PowerDC进行PCB电热混合仿真,以解决高功率密度设计中的散热难题。文章通过解析电热耦合原理,并附上详细的配置步骤与实战技巧,指导硬件工程师同步优化电气性能与热管理,从而在设计源头提升产品可靠性与效率。

weixin_29292535的博客 197

介绍阻塞队列 BlockingQueue 类

介绍阻塞队列 BlockingQueue 类 本文我们认识java.util.concurrent包中非常有用解决并发生产消费问题的类。我们将学习BlockingQueue接口的API以及如何利用这些方法使并发变成更简单。文章最后我们展示一个简单示例包括多线程环境下的生产者和消费者。 BlockingQueue 类型 我们需要区分两种类型的BlockingQueue: unbounded que...

neweastsun的专栏 1072

从零搭建Synopsys EDA环境:Ubuntu系统下的完整安装与避坑指南

本文详细介绍了在Ubuntu系统下从零搭建Synopsys EDA环境的完整流程,包括系统配置、安装文件准备、核心工具安装、License配置及常见问题排查。特别针对数字IC设计场景,提供了VCS、Verdi、Design Compiler等EDA Tools的安装避坑指南和性能优化建议,帮助开发者高效搭建稳定的开发环境。

weixin_33738982的博客 491

muduo之BlockingQueue

BlockingQueue是muduo是无界队列,利用队列(deque)实现,向队列中加入和取出元素用互斥量和条件变量结合的方式来操作,就是一个线程同步的问题。 BlockingQueue.h // Use of this source code is governed by a BSD-style license // that can be found in the L...

1万+

如何设计ADAS系统功能状态机(一)

状态机模块在自动驾驶系统中扮演着关键的角色,它负责管理和控制各个功能的状态转换和行为执行。今天我们来聊聊如何设计自动驾驶系统的状态机。

supass2018的博客 1615

Java 开发 修改【冒险岛 079 私服】完整学习流程

第 1-2 天:环境搭建 + 运行原版 079 服务端,能正常登录游戏;第 3-4 天:纯配置文件修改,掌握倍率、属性、怪物、道具的修改,改出第一个「百倍经验私服」;第 5-10 天:Java 代码基础修改,掌握 Player/Skill/Monster 核心类的修改,实现技能无冷却、一刀秒怪、升级满属性;第 11-20 天:Java 代码进阶修改,掌握业务逻辑修改,实现死亡不掉经验、自动捡物、装备强化无失败;第 21-30 天。

萧曳丶 3895

【RabbitMQ项目】前置技术:使用muduo库中基于protobuf的应用层协议进行通信

使用muduo库中基于protobuf的应用层协议进行通信

weixin_74113106的博客 1327

STM32 LwIP协议栈优化:从TCP延迟10ms降至1ms的内存配置手册

摘要: 本文针对STM32嵌入式开发中LwIP TCP通信的高延迟问题(默认配置下延迟达10~20ms),提出纯软件优化方案,通过调整内存配置与TCP参数将延迟降至1ms。核心问题包括内存池不足、pbuf分配低效及Nagle算法拖累,优化步骤包括: 内存池扩容:增大MEMP_NUM_TCP_PCB至10、PBUF_POOL_SIZE至32,避免资源竞争; pbuf静态池分配:采用2048字节大块缓冲区匹配DMA传输,减少分块与拷贝; 关闭Nagle算法:设置TCP_NODELAY=1,禁用延迟确认以加速小包

weixin_42212753的博客 1708

muduo BlockingQueue详解

利用条件变量和std::deque实现阻塞队列

aixiaoql的博客 871

Transformer 跨界物理建模:探索模拟动态物理系统方法与实践(PINN、流体力学、有限元)

是一个由 Nicholas Zabaras 团队开发的开源项目,托管于 GitHub,旨在将 Transformer 模型(最初在自然语言处理领域大获成功)应用于物理系统的建模与预测。该项目基于论文 ​*“Transformers for Modeling Physical Systems”*​(Neural Networks, 2022),探索了深度学习中的 Transformer 架构如何通过自注意力机制和 Koopman 嵌入来模拟动态物理系统。

源代码杀手的博客 1191

基于Simulink的电机热阻模型建立与仿真

本文详细介绍了基于Simulink的电机热阻模型建立方法。通过将电机传热路径分解为5段关键热阻(绕组内部、槽绝缘、铁芯、机壳、冷却系统),采用Simscape Thermal模块构建热阻网络模型。重点阐述了参数化热阻计算、实验数据校准、不同设计方案对比等关键步骤,并以15kW车用PMSM为例演示建模过程。文章还分享了非线性热阻处理、多维网络构建等高级技巧,指出该模型在热设计迭代、散热匹配、故障诊断等方面的重要工程价值,为电机热安全设计提供了有效的数字化解决方案。

xiaoheshang_123的博客 337

Muduo源码Base篇

Muduo源码Base 无界阻塞队列 class BlockingQueue : noncopyable { public: BlockingQueue() : mutex_(), notEmpty_(mutex_), queue_() { } void put(const T& x) { MutexLockGuard lock(mutex_); queue_.push_back(x); notEmpty_.notify

Nintendo_Nerd的博客 471

今日头条面试——iOS开发面试题

layoutIfNeeded和setNeedsLayout的区别。* Pod update和pod install的区别。* 10、autoreleasepool的使用场景。* 如何hook一个对象的方法,而不影响其它对象。* 数组cop后里面的元素会复制一份新的吗。* 介绍项目,主要介绍自己强项一点的地方。* assing可以使用在对象中吗。* isEquel和hash的关系。* 4、谈谈runtime的理解。* 8、谈谈runloop的理解。* copy和strong的区别。

FPGA/MATLAB学习教程/源码/项目合作开发 594

Muduo之封装BlockingQueue、BoundedBlockingQueue

阻塞队列介绍 阻塞队列首先是一个队列,数据可以由队列的一端输入,从另外一端输出。多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型。假设我们有若干生产者线程,另外又有若干个消费者线程。如果生产者线程需要把准备好的数据共享给消费者线程,利用队列的方式来传递数据,就可以很方便地解决他们之间的数据共享问题。但如果生产者和消费者在某个时间段内,万一发生数据处理速度不...

一个菜鸟的博客 523

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【muduo】base篇---BlockingQueue和BounderBlockingQueue

文章目录一、经典的生产者和消费者模型二、BlockingQueue简介(普通队列)三、BlockingQueue源码四、BounderBlockingQueue简介(环形队列)五、BounderBlockingQueue源码 一、经典的生产者和消费者模型 二、BlockingQueue简介(普通队列)   BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些...

青萍之末的博客 510

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

muduo网络库:使用无界缓冲区 BlockingQueue<T>设计生产者消费者模式

BlockingQueue 和 BoundedBlockingQueue 是 muduo 库设计的两个类,其中BlockingQueue 作为无界缓冲区,BoundedBlockingQueue作为有界缓冲区。陈硕的muduo库是开源的,感兴趣的可以自己找找代码看一下,下面对二者进行简单的介绍。 BlockingQueue 是一种加锁的 deque 不知道我这么评价陈硕写的 BlockingQue...

月光骆驼的博客 530

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

muduo::BlockingQueue、BoundedBlockingQueue分析

BlockingQueue、BoundedBlockingQueue是关于有界缓冲和无界缓冲的,是典型的生产者消费者模型的代表。

KangRoger的专栏 3293

muduo库源码学习(base)BlockingQueue和BoundBlockingQueue

#include "./Condition.h" #include "./Mutex.h" #include #include #include namespace muduo { template class BlockingQueue : boost::noncopyable//为多线程准备的队列 { public: BlockingQueue() : mutex_(

lsaejn的专栏 291

muduo-学习笔记(五)BlockingQueue部分

BlockingQueue(无界缓冲区)、BoundedBlockingQueue(有界缓冲区) 头文件BlockingQueue.h #ifndef MUDUO_BASE_BLOCKINGQUEUE_H #define MUDUO_BASE_BLOCKINGQUEUE_H #include <muduo/base/Condition.h> #include <muduo/base/Mutex.h> #include <boost/noncopyable.hpp> #in

Rong_11的博客 256

C++11 线程安全的BlockingQueue实现

C++11 BlockingQueue

大黄鸭 8190

muduo/base库学习笔记(10)-----BlockingQueue类

BlockingQueue 该类是没有上边界的,即在这个队列中,如果为空,是不能进行取走的操作,但是可以一直的往队列中进行添加 1 构造函数的实现 BlockingQueue() : mutex_(), notEmpty_(mutex_), queue_() { } 2 成员函数的实现 void put(const T& x) void put...

xiuxiu__deng的博客 331

阻塞队列-BlockQueue常用方法总结

常见阻塞队列包含ArrayBlockingQueue、DelayQueue、 LinkedBlockingDeque、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等, 阻塞队列常用方法 add offer put take remove poll element peek 对比总结

一只憨憨猿 1351

消息队列MQ实践----实现Queue(队列消息)和Topic(主题消息)两种模式

之前有篇文件介绍了生产消费者模式(http://blog.youkuaiyun.com/canot/article/details/51541920 ),当时是通过BlockingQueue阻塞队列来实现,以及在Redis中使用pub/sub模式(http://blog.youkuaiyun.com/canot/article/details/51938955)。而实际项目中往往是通过JMS使用消息队列来实现这两种模式的

mazi的博客 5865

muduo学习笔记:base部分之BlockingQueue类、BoundedBlockingQueue类

队列是一种先入先出的容器,通常应用在生产者-消费者模型中。由于在多线程中需要保证数据安全,因此需要利用互斥锁对队列操作进行加锁;当生产较慢时,消费者不能使用耗费资源的轮询操作判断是否有新数据的到来,需要利用条件变量阻塞等待数据到来的通知。以上就是线程安全阻塞队列BlockingQueue类是实现,而BoundedBlockingQueue类就是有界(队列元素个数有限)线程安全阻塞队列的实现。 在moduo库中,通常的入队的操作要小于出队的操作。 1、BlockingQueue类 线程安全、阻塞的队列。队列使

热爱生活,忠于自己 675

muduo多线程异步日志分析

最近在看muduo的源码,对于其日志系统的实现颇为感兴趣,找了两三天好好研究了一下,本文记录一些所学到的知识。 基础知识 日志是每个高性能服务器必备的组件,分为两种:诊断日志和交易日志。诊断日志,主要的作用是供开发人员和运维人员进行故障诊断和追踪,如果系统在运行过程中出现异常,也可以通过脚本语言对日志进行排查,muduo的日志系统就是属于这一类。交易日志主要是用来记录系统状态的...

haha与长颈鹿的博客 1024
上一篇: muduo库的Condition类和CountDownLatch类剖析
下一篇: C++模板之SFINAE技术
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值