#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;
}