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


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

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

我觉得写得比较简洁易懂

项目是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_ */

  • 1
  • 2
  • 3
  • 4
  • 5
  • 下一页

相关内容