您的位置:首页 > 理论基础 > 计算机网络

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 
1

2

3

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++网络库》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: