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

#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(rs == 0);
 return true;
}

然后是其派生类MyWorkThread

MyWorkThread.h

#ifndef MYWORKTHREAD_H_
#define MYWORKTHREAD_H_

#include "MyThread.h"
#include "BaseJob.h"
#include "unistd.h"
//#include "MyThreadPool.h"

class MyThreadPool;

class MyWorkThread:public MyThread{

private:
 BaseJob*  m_pJob;
 void*  m_pJobdata;
 MyThreadPool* m_pThreadPool;
public:
 MyWorkThread();
 virtual ~MyWorkThread();

void Run();
 void SetJob(BaseJob* job, void* jobdata);
 BaseJob* GetJob(void){return m_pJob;}

void SetThreadPool(MyThreadPool* threadpool);
 MyThreadPool* GetThreadPool(void){return m_pThreadPool;}
};

#endif /* MYWORKTHREAD_H_ */

MyWorkThread.cpp

#include "MyWorkThread.h"
#include "MyThreadPool.h"
#include <string.h>
#include <stdio.h>

MyWorkThread::MyWorkThread() {
 // TODO Auto-generated constructor stub
 m_pJob = NULL;
 m_pJobdata = NULL;
 m_pThreadPool = NULL;
}

MyWorkThread::~MyWorkThread() {
 // TODO Auto-generated destructor stub
 if(m_pJob != NULL){
  delete m_pJob;
 }
 if(m_pJobdata != NULL){
  delete m_pJobdata;
 }
 m_pJob = NULL;
 m_pJobdata = NULL;
 m_pThreadPool = NULL;
}

void MyWorkThread::Run(){
 for(;true;usleep(10)){
  while(m_pJob == NULL){
   usleep(20);
  }
  m_pJob->Run(m_pJobdata);
  //finish the job
  m_pJob->SetWorkThread(NULL);
  m_pJob = NULL;
  m_pThreadPool->MoveToIdleList(this);
 }
}

void MyWorkThread::SetJob(BaseJob* job, void* jobdata){
 m_pJob = job;
 m_pJobdata = malloc(sizeof(jobdata));
 memcpy(m_pJobdata, jobdata, sizeof(jobdata));
// m_pJobdata = jobdata;
 printf("Thread %lu Run the job: %d\n",this->GetThreadID(), *(int*)m_pJobdata);
 m_pJob->SetWorkThread(this);
}

void MyWorkThread::SetThreadPool(MyThreadPool* threadpool){
 m_pThreadPool = threadpool;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/cf451b32c77072aa7ded15c12e72f994.html