-
线程池ThreadPool用到
Thread
、MutexLock
、Condition
。 -
ThreadPool可以设置工作线程的数量,并向任务队列放入任务。放入到任务队列中的任务将由某个工作线程执行。
-
task使用boost::function表示,可以方便地将
函数指针
、普通函数
、成员函数(结合boost::bind)
、lambda
、重载了函数调用运算符‘()’的类的对
象(这些统称为可调用对象)放入到任务队列当中,非常方便。 -
需要使用条件变量来维护线程间的同步
,比如:通知其他线程有任务到来了,可以向任务队列放任务了等等。 -
muduo库里面的线程池是固定线程池,即创建的线程池里面的线程个数是一定的,不是动态的。
-
线程池里面一般要包含
线程队列
还有任务队列
,外部程序将任务存放到线程池的任务队列中,线程池中的线程队列执行任务,也是一种生产者和消费者模型
。
线程池实现总结
-
声明一个任务列表(std::dequeue<boost::function<void()>> queue_;),定义一个接口给外部传递任务进来(任务类型是函数指针)
-
定义两个线程间同步的条件变量:
Condition notEmpty;
Condition notFull;
//notEmpty 用来告知线程池里面的线程当前是否有尚未执行的任务(即任务列表是否空)
//notFull 用来告知传递任务的线程当前线程池的任务列表是否已经塞满
-
定义一个函数给线程池里的线程来运
该函数主要的作用是抓取任务列表中的任务,因为任务是函数指针(其实是boost::function),所以当抓取到任务后直接运行抓取到的任务函数就好了,运行好之后会返回,开始下一轮的抓取,并通知其他线程自己已经空闲了。
ThreadPool.h
#ifndef MUDUO_BASE_THREADPOOL_H
#define MUDUO_BASE_THREADPOOL_H
#include <muduo/base/Condition.h>
#include <muduo/base/Mutex.h>
#include <muduo/base/Thread.h>
#include <muduo/base/Types.h>
#include <boost/function.hpp>
#include <boost/noncopyable.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <deque>
namespace muduo
{
class ThreadPool : boost::noncopyable
{
public:
typedef boost::function<void ()> Task;
explicit ThreadPool(const string& nameArg = string("ThreadPool"));
~ThreadPool();
// Must be called before start().
void setMaxQueueSize(int maxSize) {
maxQueueSize_ = maxSize; } //设置最大线程池线程最大数目大小
void setThreadInitCallback(const Task& cb) //设置线程执行前的回调函数
{
threadInitCallback_ = cb; }
void start(int numThreads);//启动线程池
void stop();//关闭线程池
const string& name() const
{
return name_; }
size_t queueSize() const;
// Could block if maxQueueSize > 0
void run(const Task& f);//运行任务,往线程池中的任务队列添加任务
#ifdef __GXX_EXPERIMENTAL_CXX0X__
void run(Task&& f);
#endif
private:
bool isFull() const; //判满
void runInThread(