class ThreadBase
{
protected:
#ifdef LINUX
pthread_t thread_id;
#endif
#ifdef WIN32
HANDLE thread_id;
#endif
public:
bool run_flag;
bool is_end;
public:
ThreadBase();
~ThreadBase();
int start();
void stop();
bool isEnd();
virture int process(); //子类来重写
#ifdef LINUX
static void* run(void* arg);
#endif
#ifdef WIN32
static void run(void* arg);
#endif
}
void stop()
{
run_flag = false;
}
bool isEnd()
{
return is_end;
}
int start()
{
if (run_flag)
{
return 0;
}
#ifdef LINUX
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_attr_setstacksize(&thread_attr, 1024 * 10); //设置线程的堆栈大小
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); //设置线程为分离状态,即当线程结束时会自动释放资源。若是未分离状态,需要在主线程中调用join来释放。
int ret = pthread_create(&thread_id, &thread_attr, ThreadBase::run, (void*)this);
if (ret != 0)
{
printf("create failed, errno[%d],desc[%s]", errno, strerror(errno));
pthread_attr_destroy(&thread_attr);
return -1;
}
else
{
pthread_attr_destroy(&thread_attr);
return 0;
}
#endif
#ifdef WIN32
thread_id = (HANDLE)_beginthread(ThreadBase::run, 0, (void*)this);
if (thread_id == 0)
{
return -1;
}
else
{
return 0;
}
#endif
}
int process()
{
while(run_flag)
{
work();
}
}
#ifdef LINUX
void* ThreadBase::run(void* arg)
{
CThreadBase * pThread = (CThreadBase * )arg;
pThread->run_flag = true;
pThread->is_end = false;
pThread->process();
pThread->is_end = true;
return NULL;
}
#endif
#ifdef WIN32
void ThreadBase::run(void* arg)
{
ThreadBase * pThread = (ThreadBase * )arg;
pThread->run_flag = true;
pThread->is_end = false;
pThread->process();
pThread->is_end = true;
return;
}
#endif
ThreadBase::~ThreadBase()
{
stop();
}
ThreadBase::ThreadBase()
{
run_flag = false;
is_end = true;
}