首页 > 代码库 > Linux组件封装(四)使用RAII技术实现MutexLock自动化解锁
Linux组件封装(四)使用RAII技术实现MutexLock自动化解锁
我们不止一次写过这种代码:
{ mutex_.lock(); //XXX if(....) return; //XXX mutex_.unlock();}
显然,这段代码中我们忘记了解锁。那么如何防止这种情况,我们采用和智能指针相同的策略,把加锁和解锁的过程封装在一个对象中。
实现“对象生命期”等于“加锁周期”。
代码如下:
class MutexLockGuard : NonCopyable{public: MutexLockGuard(MutexLock &mutex) :mutex_(mutex) { mutex_.lock(); } ~MutexLockGuard() { mutex_.unlock(); }private: MutexLock &mutex_;};
这种把资源获取放在构造函数、资源释放放入析构函数中的做法,就是C++中的RAII技术,“资源获取即初始化”。它巧妙在C++中的栈对象是一定会析构的,所以资源一定会被释放。
这个类对于我们编写优雅的代码,好处是显而易见的,例如:
size_t Buffer::size() const{ mutex_.lock(); int ret = queue_.size(); mutex_.unlock(); return queue_.size();}
size_t Buffer::size() const{ MutexLockGuard lock(mutex_); return queue_.size();}
代码的美观性提高了许多。
当然,有一种使用方式是错误的,例如:
size_t Buffer::size() const{ MutexLockGuard(mutex_); return queue_.size();}
这段代码的加锁周期仅限于那一行,为了防止错误使用,我们增加一个宏:
#define MutexLockGuard(m) "Error MutexLockGuard"
Linux组件封装(四)使用RAII技术实现MutexLock自动化解锁
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。