基于pthread的线程池,C++实现

最近项目需要用到线程池,以前没接触过,断断续续学了两三个星期吧

先在网上找了一个用C实现的,例子挺多,不过我只看了一个

http://www.cnblogs.com/newth/archive/2012/05/09/2492459.html

我觉得写得比较简洁易懂

项目是C++写的,用的ACE框架,而且系统不算小,如果直接用C的话可能会破坏系统原有的封装和扩展性

可能会用ACE的ACE_TASK来实现线程池,但在此之前我想先自学一下基于pthread的C++的线程池实现

 

在网上也找到挺多C++的例子,不过都不全,有下到一个源码(网址忘记保存了,下次找到再补上)但完全没有讲解,就自己仿着重写了一个

 

声明:本文适合用过pthread和一定的C++面向对象编程经验的人。本人菜鸟,难免错漏,望能指正

本代码在Ubuntu12.04下用Eclipse for c++编写,编译的时候需要添加pthread的库

 

由于代码比较多,因此我先贴一个大致的流程图上来

1.在main函数中新建一个MyThreadPool对象,并对其进行初始化,新建N个子线程

2.子线程里面循环判断成员m_pJob是否为空,不为空则向下执行,运行m_pJob完毕后让该子线程从BusyList移到IdleList

3.main函数中新建Job对象(你真正想运行的东西),并把它加入线程池中,并与某子线程绑定,同时让该子线程从IdleList移到BusyList

 

小结一句:其实在线程池中Busy与Idle线程的本质区别是其成员job是否为空

 

代码本来不算多,但因为有多个类,所以看起来会比较辛苦,先贴上类图

接下来正式贴代码,注释不多,但也不复杂

代码比较多,但重点看MyThread,MyWorkThread和MyThreadPool这3个类就行了

首先是MyThread类

MyThread.h

#ifndef MYTHREAD_H_
#define MYTHREAD_H_

#include <cassert>
#include "pthread.h"

class MyThread {

public:
	MyThread();
	virtual ~MyThread();
	virtual void Run(void) = 0;

	bool 	Create(MyThread* thread);

	unsigned long 	GetThreadID(void){return m_ThreadID;}

protected:
	static void* 	ThreadRoutine(void*);

private:
	pthread_t* 	m_pThread;
	unsigned long 	m_ThreadID;

};

#endif /* MYTHREAD_H_ */

MyThread.cpp

#include "MyThread.h"

MyThread::MyThread() {
	// TODO Auto-generated constructor stub
	m_pThread = new pthread_t;
}

MyThread::~MyThread() {
	// TODO Auto-generated destructor stub
	if(m_pThread != NULL){
		delete m_pThread;
	}
	m_pThread = NULL;
}

void* MyThread::ThreadRoutine(void* para){
	MyThread* thr = (MyThread*) para;
	thr->Run();
	return NULL;
}

bool MyThread::Create(MyThread* thread){
	int rs = pthread_create(m_pThread, NULL, ThreadRoutine, (void*)thread);
	m_ThreadID = *m_pThread;
	assert
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值