在学muduo库之前,我只知道一点线程池的概念,但是对于怎么实现线程池完全不了解,最近因为被分配到了一个实验室里项目小组,于是开始学习muduo库。
在看了几遍muduo库中的ThreadPool线程池类的实现之后,感觉对线程池有了一些了解,就简单对muduo库是如何实现线程池做一些简单的说明,顺便加深一下记忆。
前置知识:
1. linux下线程的创建使用
2. 线程锁的初步了解
3. 线程条件变量的初步了解
实现思路:
1. 声明一个任务列表(std::dequeue<boost::function<void()>> queue_;),定义一个接口给外部传递任务进来(任务类型是函数指针)
2. 定义两个线程用条件变量:
Condition notEmpty;
Condition notFull;
notEmpty 用来告知线程池里面的线程当前是否有尚未执行的任务(即任务列表是否空)
notFull 用来告知传递任务的线程当前线程池的任务列表是否已经塞满
3. 定义一个函数给线程池里的线程来运行,该函数主要的作用是抓取任务列表中的任务
因为任务是函数指针(其实是boost::function),所以当抓取到任务后直接运行抓取到的任务函数就好了,运行好之后会返回,开始下一轮的抓取,并通知其他线程自己已经空闲了。
muduo::ThreadPool类的使用
/*********************************************************
* Author : crazy_mad
* Last modified : 2017-04-13 21:19
* Filename : main.cc
* Description : 测试muduo中的ThreadPool线程池
*********************************************************/
#include <muduo/base/ThreadPool.h>
#include <boost/bind.hpp>
#include <iostream>
#include <string>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
using namespace std;
using namespace muduo;
void say_1() {
cout << "this is say_1" << endl;
}
void say_2(std::string line) {
cout << line << endl;
}
int main() {
ThreadPool pool_("crazymad's pool");
pool_.setMaxQueueSize(10); // 设置任务列表容量
pool_.start(2); // 开启两个线程
pool_.run(say_1); // 传入任务
pool_.run(boost::bind(say_2, std::string("hello world")));
pool_.run(boost::bind(say_2, std::string("crazy_mad很帅")));
sleep(1); // ThreadPool没有等待子线程运行完毕的机制,这里为了方便就手动等一秒钟好了
return 0;
}