博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux组件封装(四)使用RAII技术实现MutexLock自动化解锁
阅读量:5798 次
发布时间:2019-06-18

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

我们不止一次写过这种代码:

{    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();}
这段代码实在称不上美观,但是有了MutexLockGuard,我们可以写出:
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"
这样当错误使用的时候,会导致编译错误,使得我们早些发现问题。

转载于:https://www.cnblogs.com/inevermore/p/4009694.html

你可能感兴趣的文章
CF772E Verifying Kingdom
查看>>
第二次冲刺 第七天
查看>>
测试驱动开发
查看>>
【Udacity】线性回归方程 Regression
查看>>
轻松实现远程批量拷贝文件脚本(女学生作品)
查看>>
【沟通之道】头脑风暴-女人的心思你别猜
查看>>
Windows Phone 8 开发资源汇总
查看>>
Git:配置
查看>>
神经系统知识普及
查看>>
Spring可扩展Schema标签
查看>>
c++ STL unique , unique_copy函数
查看>>
http://miicaa.yopwork.com/help/overall/
查看>>
浅谈关于特征选择算法与Relief的实现
查看>>
mybatis-spring 项目简介
查看>>
Wireshark抓取RTP包,还原语音
查看>>
Behavioral模式之Memento模式
查看>>
Work Management Service application in SharePoint 2016
查看>>
Dos 改动IP 地址
查看>>
Laravel 源码解读:php artisan make:auth
查看>>
【转】ionic run android 成功launch success,但是genymotion虚拟机没有显示
查看>>