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 条评论
登录 后参与评论

相关文章

来自专栏linux驱动个人学习

Linux 内存池【转】

925
来自专栏Android 研究

Android Handler机制2之ThreadLocal

我们看到首先是拿到当前先线程实例t,任何将t作为参数构造ThreadLocalMap对象,为什么需要通过Threadl来获取ThreadLocalMap对象?T...

751
来自专栏Java技术栈

面试必问-几种线程安全的Map解析

HashMap线程安全的吗? Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的。 看下面两个场景: 1、当用在方法内的局部变量时,局部变...

35210
来自专栏古时的风筝

我们常说的 CAS 自旋锁是什么

1592
来自专栏移动开发面面观

Java学习笔记——对象的生死

1054
来自专栏我是攻城师

深入理解Java内存模型的语义

Java内存模型(JMM)给我们介绍了在当代不同的硬件架构情况下,多线程程序需要关注什么问题以及如何利用JMM来正确的处理这些问题。

975
来自专栏Jimoer

JVM学习记录-Java内存模型(二)

在处理多线程数据竞争问题时,不仅仅是可以使用synchronized关键字来实现,使用volatile也可以实现。

653
来自专栏栗霖积跬步之旅

java多线程编程核心技术——第二章总结

第一节synchronized同步方法目录 1.1方法内的变量为线程安全的 1.2实例变量非线程安全 1.3多个对象多个锁 1.4synch...

18310
来自专栏好好学java的技术栈

谁问你ThreadLocal,就把这篇文章丢给他

ThreadLocal是线程局部变量,所谓的线程局部变量,就是仅仅只能被本线程访问,不能在线程之间进行共享访问的变量。在各个Java web的各种框架中Thre...

622
来自专栏瞎说开发那些事

[Java并发系列]Java并发容器和框架

1634

扫码关注云+社区