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非成员函数,但是还有什么好招呢?