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

5 篇文章 0 订阅

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



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值