首页 > 代码库 > Linux组件封装(三) Thread的封装
Linux组件封装(三) Thread的封装
声明代码如下:
1 #ifndef THREAD_H 2 #define THREAD_H 3 4 #include "NonCopyable.h" 5 #include <pthread.h> 6 #include <sys/types.h> 7 8 class Thread : NonCopyable 9 {10 public:11 Thread();12 ~Thread();13 14 void start();15 void join();16 17 pthread_t getThreadId() { return _threadId; }18 virtual void run()=0;19 20 private:21 static void *func(void *arg);22 23 pthread_t _threadId;24 bool _isRun;25 };26 27 #endif
为了调用pthread_create创建线程,我们往里面注册的不能是一个成员函数,因为成员函数含有一个隐式参数,导致函数的指针类型并不是void *(*start_routine) (void *),所以我们采用了static函数。
static函数无法访问某一对象的成员,所以我们在调用pthread_create时,将this指针作为回调函数的参数。
这个Thread不提供detach函数,因为我们在析构函数中做了如下的处理,如果Thread对象析构,线程还在运行,那么需要将Thread设置为detach状态。
大部分逻辑都是固定的,用户只需要改变run里面的代码即可,于是我们将run设置为纯虚函数,让用户继承Thread类。
cpp代码实现如下:
1 #include "Thread.h" 2 #include <iostream> 3 #include <assert.h> 4 #include <unistd.h> 5 #include <pthread.h> 6 #include <sys/syscall.h> 7 using namespace std; 8 9 Thread::Thread()10 :_threadId(0),11 _isRun(false)12 { }13 14 Thread::~Thread()15 {16 if(_isRun)17 pthread_detach(_threadId);18 }19 20 21 void *Thread::func(void *arg)22 {23 Thread *p = static_cast<Thread *>(arg);24 p->run();25 return NULL;26 }27 28 29 void Thread::start()30 {31 pthread_create(&_threadId, NULL, Thread::func, this);32 _isRun = true;33 }34 35 void Thread::join()36 {37 assert(_isRun);38 pthread_join(_threadId, NULL);39 _isRun = false;40 }
我们采用继承的方式使用这个类。测试代码如下:
1 #include "Thread.h" 2 #include <iostream> 3 #include <unistd.h> 4 using namespace std; 5 6 class MyThread : public Thread 7 { 8 public: 9 void run()10 {11 cout << "foo" << endl;12 }13 };14 15 int main(int argc, char const *argv[])16 {17 MyThread t;18 t.start();19 20 t.join();21 22 return 0;23 }
Linux组件封装(三) Thread的封装
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。