博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux组件封装之一:MUtexLock
阅读量:4597 次
发布时间:2019-06-09

本文共 1795 字,大约阅读时间需要 5 分钟。

本文对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 
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

 

转载于:https://www.cnblogs.com/xfxu/p/4008654.html

你可能感兴趣的文章
队列实现霍夫曼树
查看>>
【Java】图片高质量缩放类
查看>>
Python :类中设置默认属性并修改
查看>>
磁盘管理综合测试
查看>>
Unity3d Shader开发(三)Pass(Pass Tags,Name,BindChannels )
查看>>
UMLet
查看>>
从父控件移除控件
查看>>
calc()制作自适应布局
查看>>
Markdown-写作必备
查看>>
关于在Java中 a!=a 值为真的解释(摘抄)
查看>>
C#串口小助手
查看>>
详解定位与定位应用
查看>>
【前端开发】 5分钟创建 Mock Server
查看>>
一个Tomcat配置参数引发的血案
查看>>
java 从键盘录入的三种方法
查看>>
使用jQuery和YQL,以Ajax方式加载外部内容
查看>>
pyspider 示例
查看>>
Ubuntu下Sublime Text 3解决无法输入中文的方法
查看>>
电路板工艺中的NPTH和PTH
查看>>
JNI实现JAVA和C++互相调用
查看>>