muduo库源码学习(base)mutex
来源:互联网 发布:淘宝刷销量好评 编辑:程序博客网 时间:2024/06/05 22:14
class MutexLock : boost::noncopyable//最常用的类.就是std::mutex,对应的还是lock_guard和unique_lock{ public: MutexLock() : holder_(0) { MCHECK(pthread_mutex_init(&mutex_, NULL)); } ~MutexLock() { assert(holder_ == 0); MCHECK(pthread_mutex_destroy(&mutex_)); } // must be called when locked, i.e. for assertion bool isLockedByThisThread() const { return holder_ == CurrentThread::tid(); } void assertLocked() const { assert(isLockedByThisThread()); } // internal usage void lock() { MCHECK(pthread_mutex_lock(&mutex_)); assignHolder(); } void unlock() { unassignHolder(); MCHECK(pthread_mutex_unlock(&mutex_)); } pthread_mutex_t* getPthreadMutex() /* non-const */ { return &mutex_; } private: friend class Condition; class UnassignGuard : boost::noncopyable//这个类比较有意思, { public: UnassignGuard(MutexLock& owner)//在wait里构造一个本对象,构造时将锁的拥有者线程id置0,析构时本线程重新获得锁 : owner_(owner) { owner_.unassignHolder(); } ~UnassignGuard() { owner_.assignHolder(); } private: MutexLock& owner_; }; void unassignHolder() { holder_ = 0; } void assignHolder() { holder_ = CurrentThread::tid(); } pthread_mutex_t mutex_; pid_t holder_;};// Use as a stack variable, eg.// int Foo::size() const// {// MutexLockGuard lock(mutex_);// return data_.size();// }class MutexLockGuard : boost::noncopyable{ public: explicit MutexLockGuard(MutexLock& mutex) : mutex_(mutex) { mutex_.lock(); } ~MutexLockGuard() { mutex_.unlock(); } private: MutexLock& mutex_;};
阅读全文
0 0
- muduo库源码学习(base)mutex
- muduo库源码学习(base)Atomic
- muduo库源码学习(base)AsyncLogging
- muduo库源码学习(base)Condition
- muduo库源码学习(base)CountDownLatch
- muduo库源码学习(base)Date
- muduo库源码学习(base)Exception
- muduo库源码学习(base)FileUtil
- muduo库源码学习(base)singleton
- muduo库源码学习(base)ThreadLocal
- muduo库源码学习(base)ThreadLocalSingleton
- muduo库源码学习(base):Logfile
- muduo库源码学习(base):LogStream
- muduo库源码学习(base):WeakCallback
- [Muduo网络库源码分析] (6) base/Mutex.h_互斥锁操作
- muduo库源码学习(base)BlockingQueue和BoundBlockingQueue
- muduo库源码学习(base)Thread和CurrentThread
- muduo学习笔记之mutex
- redis(五)跳跃表
- 算法第九周Edit Distance[hard]
- 虚拟机下的Ubuntu16.04
- 设计模式六大原则(2):里氏替换原则
- 哈弗曼树 C语言
- muduo库源码学习(base)mutex
- python从数据库读取几百万条的数据结果内存直接爆掉
- Ubuntu16.04,CUDA8.0,Caffe-ssd,OpenCV3.1配置指南(二)
- java 将ftl文件作为模板导出word文档
- 收集的面试中的脑力题智力题
- CorelDraw油字体怎么做是一个菜鸟和大师的区别
- [DP] BZOJ2660: [Beijing wc2012]最多的方案
- 祖冲之是如何求取 Pi 的(原理很简单,初中的水平就可以懂)
- haproxy 实用配置解析