muduo库中对线程池的实现(1)

来源:互联网 发布:金鼎网络微营销软件 编辑:程序博客网 时间:2024/06/05 08:01

在学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;}



0 0
原创粉丝点击