Linux中POSIX线程的接口都是C风格的,在C++中必须做一个wrapper类去套住它们。刚好在一个开源的项目中看到一个简单有效的代码,特贴出来,雅俗共赏。
Thread.h
#ifndef _THREAD_H_
#define _THREAD_H_
#include <pthread.h>
class Thread
{
pthread_t thread;
bool runnableFlag;
private:
void setRunnableFlag(bool flag);
public:
Thread();
virtual ~Thread();
virtual bool start();
virtual void run() = 0;
bool isRunnable();
virtual bool stop();
bool restart()
{
stop();
start();
return true;
}
};
#endif
Thread.cpp
#include <Thread.h>
#include <stdio.h>
static void *PosixThreadProc(void *param)
{
Thread *thread = (Thread *)param;
thread->run();
return 0;
}
Thread::Thread()
{
setRunnableFlag(false);
}
bool Thread::start()
{
setRunnableFlag(true);
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
if (pthread_create(&thread, &thread_attr, PosixThreadProc, this) != 0) {
setRunnableFlag(false);
pthread_attr_destroy(&thread_attr);
}
pthread_attr_destroy(&thread_attr);
return true;
}
Thread::~Thread()
{
stop();
}
bool Thread::stop()
{
if (isRunnable() == true) {
setRunnableFlag(false);
pthread_cancel(thread);
pthread_detach(thread);
}
return true;
}
void Thread::setRunnableFlag(bool flag)
{
runnableFlag = flag;
}
bool Thread::isRunnable()
{
return runnableFlag;
}
其中还是不可避免地使用了PosixThreadProc非成员函数,但是还有什么好招呢?