多线程编程 -- MutexLock
2016-07-28 23:16
281 查看
互斥量Mutex
互斥量本质上是一把锁,在访问共享资源钱对互斥量进行加锁,访问完成之后释放互斥量的锁。pthread_mutex_t , 使用之前,必须首先对初始化
对互斥量进行加锁,调用pthread_mutex_lock
如果互斥量已经上锁,则线程将阻塞知道互斥量被解锁
如果不希望被阻塞,它可以使用pthread_mutex_trylock 尝试对互斥量进行加锁。如果互斥量处于未锁住状态, 那么pthread_mutex_trylock 将锁住互斥量,不会出现阻塞并返回0, 否则pthread_mutex_trylock就会失败,不会锁住互斥量,而返回EBUSY 。
下面来实现一个cpp 版本的Mutex
首先写一个类NoCopy,字面意思就是让类不能复制,具体的就是不能通过构造函数和赋值函数来构造对象。要达到这个目的,只需要自定义类型从这个类派生即可。原理就是把拷贝构造函数和赋值函数屏蔽掉,叫编译器编译不过。
nocopy.h
#ifndef COMMON_BASE_NOCOPY_H_ #define COMMON_BASE_NOCOPY_H_ #ifndef NOCOPY_CLASS #define NOCOPY_CLASS(Class) \ private: \ Class(const Class&) = delete; \ Class& operator=(const Class&) = delete #endif namespace common { class Uncopyable { // private by default NOCOPY_CLASS(Uncopyable); public: Uncopyable() {} ~Uncopyable() {} }; } // namespace common typedef common::Uncopyable Uncopyable; #endif // COMMON_BASE_NOCOPY_H_
这里使用宏定义NOCOPY 把拷贝构造函数和赋值函数屏蔽掉。
下面是一个cpp 版本的Mutex
mutex.h
class MutexLock { NOCOPY_CLASS(MutexLock); public: MutexLock() :status_(true) { if (pthread_mutex_init(&lock_, 0) != 0) { status_ = false; // 初始化失败 } } virtual ~MutexLock() { if (status_ == true) { pthread_mutex_destroy(&lock_); } } void Lock() { if (status_ == true) { pthread_mutex_lock(&lock_); //assert(IsLocked()); } } int TryLock() { if (status_ == true) { return pthread_mutex_trylock(&lock_); } return -1; } void Unlock() { //assert(IsLocked()); if (status_ == true) { pthread_mutex_unlock(&lock_); } } bool IsLocked() const { return lock_.__data.__lock > 0; } private: pthread_mutex_t lock_; bool status_; };
注意:
通过成员函数Lock()进行上锁, Unlock() 进行解锁。不过并不推荐实践中直接去调用成员函数,因为调用成员函数就意味着,必须记住在每个函数出口都要去调用unlock(),也包括异常的情况。这是十分蛋疼的一件事。推荐使用 C++标准的RAII 来实现一个lock_guard 模版类,这个类在构造的时候提供已锁的互斥量,并且在析构的时候进行解锁,从而保证了一个已锁的互斥量总是会被正确地解锁。
下面给出lock_guard 的模版类
template <typename LockType> class LockGuard { NOCOPY_CLASS(LockGuard); public: LockGuard(LockType* lock): lock_(lock) { lock_->Lock(); } ~LockGuard() { lock_->Unlock(); } private: LockType* lock_; };
相关文章推荐
- 用vbscript实现启用 Caps Lock (大写)键
- C#中lock死锁实例教程
- C#中实现线程同步lock关键字的用法详解
- 解析使用C# lock同时访问共享数据
- C#中Mutex对象用法分析
- [Oracle] 浅谈Lock与Latch
- C#使用Mutex简单实现程序单实例运行的方法
- mysql下普通用户备份数据库时无lock tables权限的解决方法
- C#中的lock、Monitor、Mutex学习笔记
- C#中lock用法详解
- Python多线程同步Lock、RLock、Semaphore、Event实例
- Java多线程编程之Lock用法实例
- Python多线程编程(四):使用Lock互斥锁
- Python多进程同步Lock、Semaphore、Event实例
- HAZELCAST 客户端命令 可用于简单调试
- POSIX 线程库功能接口与知识点汇总
- [转载]Pthreads mutex VS Pthreads spinlock
- E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource ....
- E: Could not get lock /var/cache/apt/archives/lock (resource unavailable)
- Lock java synchronized sendlockCondition.await sendlockCondition.signal();