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