muduo网络库学习之BlockinngQueue<T>类、ThreadPool 类、Singleton类封装中的知识点
2013-11-01 19:14
561 查看
一、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;
代码中有这么一段:
C++ Code
初看有点奇怪,其实是因为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++网络库》
生产者消费者问题,可以用信号量+互斥锁 或者 条件变量+互斥锁 来解决,还分为有界和无界缓冲区两种情形,如下图:
有界缓冲区:
生产者:
信号量+互斥锁: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;
代码中有这么一段:
C++ Code
1 2 3 | threads_.push_back(new muduo::Thread( boost::bind(&ThreadPool::runInThread, this), name_ + id)); threads_[i].start(); |
三、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++网络库》
相关文章推荐
- muduo 6 网络库学习之BlockinngQueue<T>类、ThreadPool 类、Singleton类封装中的知识点
- muduo网络库学习之ThreadLocal<T> 类、ThreadLocalSingleton<T>类封装知识点
- Android学习之 有关图片缓存问提的代码封装<二>
- 【UDK官方教程】知识点学习<第一章>
- 自己学习中的知识点(5)---List<自定义类型> 按自定义类型中某个字段排序
- HTML学习---------1.9 引用标签<q>和<blockquote>
- 7.14<q><blockquote>学习笔记
- <学习记录>Queue源码学习
- <STL学习笔记>Priority_queue
- 黑 马 程 序 员_视频学习总结<Objective-C>----04 内存管理、protocol、block、ARC
- muduo网络库学习之Exception类、Thread 类封装中的知识点(重点讲pthread_atfork())
- Android学习之 有关图片缓存问提的代码封装<一>
- muduo网络库学习之Logger类、LogStream类、LogFile类封装中的知识点
- <C语言>数组与指针详细知识点(全)
- python 爬虫学习<将某一页的所有图片下载下来>
- RT-Thread 学习笔记(十一)--- 开启基于RTGUI的LCD显示功能(1)<LCD驱动接口移植>
- android <初级篇> 发送短信(调用已有接口)——菜鸟的学习之路
- <需要补充学习的资料>: AVL tree , Tire tree(前缀树(prefix tree),后缀树(suffix tree)),radix tree, aho-corasick
- Android View 内存性能分析学习 <2>
- iOS Code Signing 学习笔记<转写>