MutexLock 封装临界区(critical section),这是一个简单的资源类,用RAII 手法[CCS,条款13] 封装互斥器的创建与销毁。临界区在Windows 上是struct CRITICAL_SECTION,是可重入的;在Linux 下是pthread_mutex_t,默认是不可重入的。MutexLock 一般是别的class 的数据成员。

MutexLockGuard 封装临界区的进入和退出,即加锁和解锁。MutexLockGuard 一般是个栈上对象,它的作用域刚好等于临界区域。

class noncopyable
{public:noncopyable(const noncopyable&) = delete;   //禁止生成void operator=(const noncopyable&) = delete;protected:noncopyable() = default;~noncopyable() = default;
};class MutexLock : noncopyable
{public:MutexLock(){pthread_mutex_init(&mutex_, NULL);   //初始化互斥量}~MutexLock(){pthread_mutex_destroy(&mutex_);      //销毁互斥量}// internal usagevoid lock() {pthread_mutex_lock(&mutex_);}void unlock() {pthread_mutex_unlock(&mutex_);}pthread_mutex_t* getPthreadMutex() /* non-const */{return &mutex_;}pthread_mutex_t mutex_;};class  MutexLockGuard : noncopyable
{public:explicit MutexLockGuard(MutexLock& mutex) : mutex_(mutex){mutex_.lock();                       //调用互斥量上锁}~MutexLockGuard() {mutex_.unlock();                    //调用互斥量解锁}private:MutexLock& mutex_;
};
class Condition : noncopyable
{public:explicit Condition(MutexLock& mutex): mutex_(mutex){pthread_cond_init(&pcond_, NULL);}~Condition(){pthread_cond_destroy(&pcond_);}void wait(){MutexLock::UnassignGuard ug(mutex_);pthread_cond_wait(&pcond_, mutex_.getPthreadMutex());}// returns true if time out, false otherwise.bool waitForSeconds(double seconds);void notify(){pthread_cond_signal(&pcond_);}void notifyAll(){pthread_cond_broadcast(&pcond_);}private:MutexLock& mutex_;pthread_cond_t pcond_;
};

实例:

编写单个的线程安全的 class 不算太难,只需用同步原语保护其内部状态。例如 下面这个简单的计数器类 Counter:

// A thread-safe counter
class Counter : boost::noncopyable
{
// copy-ctor and assignment should be private by default for a class.
public:Counter() : value_(0) {}int64_t value() const;int64_t getAndIncrease();
private:int64_t value_;mutable MutexLock mutex_;
};int64_t Counter::value() const
{MutexLockGuard lock(mutex_); // lock 的析构会晚于返回对象的构造,return value_;              // 因此有效地保护了这个共享数据。
}int64_t Counter::getAndIncrease()
{MutexLockGuard lock(mutex_);  //返回对象前,lock的析构函数会自动调用释放互斥锁函数int64_t ret = value_++;return ret;
}
//

总结:由上代码分析知,MutexLockGuard类解决了自动释放互斥量的问题,可有效避免人为失误的问题。

【muduo源码分析 】 MutexLock和MutexLockGuard封装相关推荐

  1. muduo源码分析——TcpServer和Acceptor

    这篇文章用于分析muduo的TcpServer类和Acceptor类,原本打算将TcpConnection也放到这里一起聊的,但是那个太多啦,一篇文章太长会让人读的很不舒服把. 当然我用的代码是其他大 ...

  2. muduo库net源码分析六(Socket 封装)

    Endian.h 封装了字节序转换函数(全局函数,位于muduo::net::sockets名称空间中). #ifndef MUDUO_NET_ENDIAN_H #define MUDUO_NET_E ...

  3. 【muduo源码分析】Buffer类的设计

    目录 1.muduo的IO模型 2.为什么 non-blocking 网络编程中应用层 buffer 是必须的? 2.1 TcpConnection 必须要有 output buffer 2.2 Tc ...

  4. muduo源码分析2——Singleton分析

    1. 一般singleton写法 单例模式即要求只有在第一次调用的时候创建该对象,主要分为以下两条路(返回指针还是引用),返回引用可以防止使用中delete instance导致对象被提前销毁: pr ...

  5. muduo源码分析之EventLoop::runInLoop()函数

    前面所学的一些内容,从最早的什么都不做的EventLoop开始,到后面的定时器,功能不断在丰富,不过一直都是单线程下的.也就是说EventLoop对象在主线程中进行事件循环.今天花了一天时间所学习的E ...

  6. muduo源码分析之TcpServer模块

    这次我们开始muduo源代码的实际编写,首先我们知道muduo是LT模式,Reactor模式,下图为Reactor模式的流程图[来源1] 然后我们来看下muduo的整体架构[来源1] 首先muduo有 ...

  7. muduo源码分析之Buffer

    这一次我们来分析下muduo中Buffer的作用,我们知道,当我们客户端向服务器发送数据时候,服务器就会读取我们发送的数据,然后进行一系列处理,然后再发送到其他地方,在这里我们想象一下最简单的Echo ...

  8. 【muduo源码分析】TcpServer服务架构

    1.muduo整体类图 2.服务器TcpServer (1)TcpServer由用户直接使用,生命周期由用户控制,用户设置好相应的回调MessageCallback.ConnectionCallbac ...

  9. muduo源码分析之回调模块

    这次我们主要来说说muduo库中大量使用的回调机制.muduo主要使用的是利用Callback的方式来实现回调,首先我们在自己的EchoServer构造函数中有这样几行代码 EchoServer(Ev ...

最新文章

  1. 3.6 判断两个链表是否相交
  2. 重磅!SCI顶级牛刊《Science》合集(2018~2020年度)
  3. python参数中的*和**
  4. 2021年上半年内容型社交电商行业分析报告
  5. RTL8201网络芯片讲解
  6. iptables: Resource temporarily unavailable.问题
  7. 一次澄清:数据分析思维五大误区
  8. 多元有序logistic回归分析_多元logistics回归分析
  9. matlab调取excel非线性拟合,用matlab实现非线性曲线拟合_matlab非线性曲线拟合
  10. 通过网页获取图片操作步骤
  11. CS模式(客户端到服务器端)
  12. aps审核计算机笔试试题,APS审核—计算机组成原理.doc
  13. Python中print的用法
  14. 计算机默认登录用户名和密码是什么,Windows7默认管理员账户用户名和密码是什么...
  15. 太阳诱电 | 汽车用金属功率电感器MCOIL™ LCEN 系列实现商品化
  16. 线性光耦原理与电路设计
  17. 开鑫金服落实“同心圆”工程 为老年投资人保驾护航
  18. docker 容器启动提示,ipv4不能被使用
  19. 微信公众平台接口调试工具json格式不对怎么搞_腾讯云和微信推出更快速的小程序开发平台,微信读书小程序作示范...
  20. 【Python学习教程】Python编程基础

热门文章

  1. 从程序设计、tqdm到lambda:python的“奇技淫巧”,让实现效率翻倍【科学计算类】
  2. [Java]知乎下巴第3集:来人啊快把知乎的答案装到篮子里去
  3. Tip:创建SCOM 2012 R2报表服务器时的报错
  4. objective-c block 讲解
  5. oracle机票,全球机票分销系统
  6. LA 2572 Viva Confetti (Geometry.Circle)
  7. Android 使用Nginx rtmp 模块
  8. IHttpModule与IHttpHandler的区别整理
  9. linux grub内核选择,UBUNTU GRUB没有内核选项,怎么回事啊?
  10. 检验学习笔记-寄生虫