Linux组件封装之一:MUtexLock
本文对pthread_mutex_t 进行简易的封装;
互斥锁主要用于互斥,描述的是一种竞争关系,主要是一个 一种资源或者代码, 在一段时间内 至多能被一个程序访问。
而条件变量主要用于线程间同步, 描述的是一种协作关系。
Linux中互斥锁的应用比较简单,通用的有以下几个函数:
1 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); 2 int pthread_mutex_lock(pthread_mutex_t *mutex); 3 int pthread_mutex_unlock(pthread_mutex_t *mutex); 4 int pthread_mutex_destroy(pthread_mutex_t *mutex);
说明:
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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。