Linux学习之 Thread 的封装

本篇我们将讨论线程Thread、互斥锁MutexLock、条件变量Condition的封装;

说明:

1、MutexLock、Condition利用构造函数和析构函数自动完成资源的申请和释放

2、MutexLock、Condition和Thread 都涉及到系统资源,这些类 全部为不可复制的;例如,a程序启动了一把锁,而另外一个程序 b 复制了这把锁,若某一时刻,a程序把这把锁销毁了,这时无论如何,b程序都不可能拥有锁这个系统资源。因此,我们将其作为 NonCopyable 类 的私有继承。

一、NonCopyable类:

 1 #ifndef NONCOPYABLE_H_
 2 #define NPNCOPYABLE_H_
 3 
 4 class NonCopyable //禁用值语义
 5 {
 6     public:
 7         NonCopyable(){ }
 8         ~NonCopyable(){ }
 9 
10     private:
11         NonCopyable(const NonCopyable &);//no copy
12         void operator=(const NonCopyable &);//no assignment
13 };
14 
15 #endif

 

二、互斥锁类(MutexLock),代码如下:

 1 #ifndef MUTEX_LOCK_H
 2 #define MUTEX_LOCK_H
 3 #include "NonCopyable.h"
 4 #include "pthread.h"
 5 #include <assert.h>
 6         
 7 //attention
 8 class MutexLock:NonCopyable
 9 {
10     public:
11         MutexLock();
12         ~MutexLock();
13         
14         void lock(); //上锁
15         void unlock();//释放锁
16         bool isLocking() const { return isLocked_;}//判断锁的状态
17         pthread_mutex_t getMutex()
18         { return mutex_; }
19     private:
20         pthread_mutex_t mutex_;
21         bool isLocked_;//标记是否上锁
22 };
23 
24 MutexLock::MutexLock()
25     :isLocked_(false)
26 {
27     pthread_mutex_init(&mutex_, NULL);
28 }
29 MutexLock::~MutexLock()
30 {
31     //判断是否已经解锁
32     assert(!isLocking());
33     pthread_mutex_destroy(&mutex_);
34 }
35 void MutexLock::lock()
36 {
37     isLocked_ = true;
38     pthread_mutex_lock(&mutex_);
39 }
40 void MutexLock::unlock()
41 {
42     isLocked_ = false;
43     pthread_mutex_unlock(&mutex_);
44 }
45 
46 #endif


三、条件变量类(Condition):

 1 #ifndef CONDITION_H_
 2 #define CONDITION_H_
 3 
 4 #include "NonCopyable.h"
 5 #include "MutexLock.h"
 6 #include <pthread.h>
 7 
 8 class Condition:NonCopyable //私有继承
 9 {
10     public:        
11         Condition(MutexLock &mutex);
12         ~Condition();
13 
14         void wait();//等待
15         void signal();//发送信号
16     private:
17         pthread_cond_t cond_;
18         MutexLock &mutex_; //wait函数的参数
19 };
20 
21 Condition::Condition(MutexLock &mutex)
22     :mutex_(mutex)
23 {
24     pthread_cond_init(&cond_, NULL);
25 }
26 
27 Condition::~Condition()
28 {
29     pthread_cond_destroy(&cond_);
30 }
31 
32 void Condition::wait()
33 {
34     pthread_mutex_t  lock = mutex_.getMutex(); 
35     pthread_cond_wait(&cond_, &lock);
36 }
37 
38 void Condition::signal()
39 {
40     pthread_cond_signal(&cond_);
41 }
42 #endif

 

四、线程类(Thread):

注意

1、线程在默认情况下 是 joinable(可结合状态),需要手工调用 join函数(将其回收),也可以将其设置为detachable分离状态),线程运行完毕后自动消亡;

2、Thread类采用static函数作为 pthread_create的回调函数,原因在于普通成员函数含有一个隐式参数(该类的对象 本身),所以函数指针类型除了有void*参数外,还有一个 Thread 对象的隐式参数,所以 这就与 void*(*)(void*)参数不匹配;

类成员的声明 如下

1 private:
2    void *runInThread (void *); //这里是普通成员函数
3     pthread_t  tid_;
4     bool isRuning_;

 

pthread_create:

 1 void *Thread::runInThread (void *arg)
 2 {
 3     cout << "foo"<< endl;
 4 }
 5 
 6 void Thread::start()
 7 {
 8     //这里的runInThread参数有两个,一个是Thread的一个对象(隐含参数),另一个是void*
 9     //解决办法:将runInThread声明为static函数
10     pthread_create(&tid_, NULL, Thread::runInThread,NULL);//wrong
11     isRuning_ =true;
12 }

 

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