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

    xiaoxiao2021-04-14  57

    在学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; }
    转载请注明原文地址: https://ju.6miu.com/read-669893.html

    最新回复(0)