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 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。