muduo网络库学习之BlockinngQueue<T>类、ThreadPool 类、Singleton类封装中的知识点

一、BlockinngQueue<T>类、BoundedBlockingQueue<T>类

生产者消费者问题,可以用信号量+互斥锁 或者 条件变量+互斥锁 来解决,还分为有界和无界缓冲区两种情形,如下图:

有界缓冲区:

生产者:

信号量+互斥锁:1,2,3,4,5

条件变量+互斥锁:2,1,3,5,4(外框)

消费者:

信号量+互斥锁:1,2,3,4,5

条件变量+互斥锁:2,1,3,5,4(外框)

无界缓冲区:

生产者:

信号量+互斥锁:2,3,4,5

条件变量+互斥锁:2,3,5,4(外框)

消费者:

信号量+互斥锁:1,2,3,4

条件变量+互斥锁:2,1,3,4(外框)

template<typename T> class BlockingQueue : boost::noncopyable

无界缓冲区:使用条件变量+互斥锁实现,put()可以看作是生产者,take()可以看作实现消费者,内部的实现就是上述4个步骤的集合。

template<typename T> class BoundedBlockingQueue : boost::noncopyable

有界缓冲区:与无界缓冲区多了一个条件变量notFull成员,并且使用boost库的环形缓冲区。

二、ThreadPool类(固定线程数,不考虑线程数动态增减)

线程池本质上也是生产者消费者问题:

生产者线程向任务队列添加任务,消费者线程(在线程队列中)从任务队列取出任务去执行。

class ThreadPool : boost::noncopyable

typedef boost::function<void ()> Task;

代码中有这么一段:

threads_.push_back(new muduo::Thread(
                       boost::bind(&ThreadPool::runInThread, this), name_ + id));
threads_[i].start();

初看有点奇怪,其实是因为ptr_vector<T>重载了[], 即 T& operator[]( size_type n );

三、singleton类

template<typename T> class Singleton : boost::noncopyable

1、pthread_once

pthread_once(&ponce_, &Singleton::init);

保证init函数只被调用一次,即只初始化一个对象。在init内部 value_ = new T();

2、atexit

  ::atexit(destroy);

在init 函数内注册destroy,在程序结束时会调用destroy,在destroy内部delete value_;

3、typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];

假设class A; A* p; delete p; 现在A只是前向声明,是不完全类型,那么delete p会出问题,但在编译时只是报警告。

sizeof(A) == 0; 故 typedef char T_must[-1]; 在编译时就会出错。

参考:

muduo manual.pdf

《linux 多线程服务器编程:使用muduo c++网络库》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

对X86汇编的理解与入门

本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令、逻辑计算指令、算数运算指...

2703
来自专栏康怀帅的专栏

PHP 变量与常量

本文介绍了 PHP 变量与常量。 官方文档:http://php.net/manual/zh/language.variables.php 官方文档:http:...

2674
来自专栏蓝天

高效的使用stl::map和std::set

if (map.find(X) == map::end()) // 需要find一次

1702
来自专栏java架构师

Unit断言学习

[TestMethod]—用于把一个方法标记为一个测试方法。当你运行你的测试时,仅标记有这个属性的方法才能够运行。 [TestClass]—用于把一个类标记为...

26811
来自专栏大内老A

关于CLR内存管理一些深层次的讨论[上篇]

半年之前,PM让我在部门内部进行一次关于“内存泄露”的专题分享,我为此准备了一份PPT。今天无意中将其翻出来,觉得里面提到的关于CLR下关于内存管理部分的内存还...

1748
来自专栏技术博客

Knockout.Js官网学习(Mapping高级用法一)

有时候,在使用ko.mapping.fromJS的时候,可能有必要去使用mapping的高级用法来定义mapping的详细过程,以后定义了,以后再调用的时候就不...

1161
来自专栏熊二哥

快速入门系列--CLR--03泛型集合

.NET中的泛型集合 在这里主要介绍常见的泛型集合,很多时候其并发时的线程安全性常常令我们担忧。因而简述下.NET并发时线程安全特性,其详情请见MSDN。 ...

1697
来自专栏编程

30个基本的Python技巧和窍门程序员

1.就地交换两个数字。 Python提供了一种直观的方式来分配和交换一行。请参考下面的例子。 x,y = 10,20print(x,y) x,y = y,xpr...

2077
来自专栏IT派

菜鸟用Python操作MongoDB,看这一篇就够了

MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文...

881
来自专栏魂祭心

原 What Every Dev need

2748

扫码关注云+社区