Muduo库源码分析(5):互斥锁,条件变量类
来源:互联网 发布:矩阵的实际应用 编辑:程序博客网 时间:2024/06/15 06:05
- 互斥锁(muduo库简单的封装)
将muduo库的线程id的操作去除的简单版本
// 出错处理#define MCHECK(ret) ({ __typeof__ (ret) errnum = (ret); assert(errnum == 0); (void) errnum;})class MutexLock : noncopyable{ public: MutexLock() { // 初始化互斥锁 MCHECK(pthread_mutex_init(&mutex_, NULL)); } ~MutexLock() { // 销毁互斥锁 MCHECK(pthread_mutex_destroy(&mutex_)); } void lock() { // 加锁 MCHECK(pthread_mutex_lock(&mutex_)); } void unlock() { // 解锁 MCHECK(pthread_mutex_unlock(&mutex_)); } pthread_mutex_t* getPthreadMutex() { // 获取锁 return &mutex_; } private: pthread_mutex_t mutex_;// 互斥锁};// 对加锁和解锁操作进行封装,采用的是C++的RAII机制,好处是不需要手动进行解锁操作,由MutexLockGuard类自动管理解锁操作(析构函数完成)。链接:[http://www.cnblogs.com/gnuhpc/archive/2012/12/04/2802307.html "C++ RAII机制"]class MutexLockGuard : noncopyable{ public: explicit MutexLockGuard(MutexLock& mutex) : mutex_(mutex) { mutex_.lock(); } ~MutexLockGuard() { mutex_.unlock(); } private: MutexLock& mutex_;// 采用的是引用,目的是该类只负责加锁和解锁,而互斥量的销毁由MutexLock类负责 };// 阻止匿名互斥量的操作#define MutexLockGuard(x) error "Missing guard object name"
- 条件变量类封装
class Condition : noncopyable{ public: explicit Condition(MutexLock& mutex) : mutex_(mutex) { // 条件变量初始化 MCHECK(pthread_cond_init(&pcond_, NULL)); } ~Condition() { // 消除条件变量 MCHECK(pthread_cond_destroy(&pcond_)); } void wait() {MCHECK(pthread_cond_wait(&pcond_,mutex_.getPthreadMutex())); } void notify() { MCHECK(pthread_cond_signal(&pcond_)); } void notifyAll() { MCHECK(pthread_cond_broadcast(&pcond_)); } bool waitForSeconds(double seconds) { struct timespec abstime; clock_gettime(CLOCK_REALTIME, &abstime); const int64_t kNanoSecondsPerSecond = 1e9; int64_t nanoseconds = static_cast<int64_t>(seconds * kNanoSecondsPerSecond); abstime.tv_sec += static_cast<time_t>((abstime.tv_nsec + nanoseconds) / kNanoSecondsPerSecond); abstime.tv_nsec = static_cast<long>((abstime.tv_nsec + nanoseconds) % kNanoSecondsPerSecond); MutexLock::UnassignGuard ug(mutex_); return ETIMEDOUT == pthread_cond_timedwait(&pcond_, mutex_.getPthreadMutex(), &abstime); } private: MutexLock& mutex_;// 互斥量 pthread_cond_t pcond_;// 条件变量};
- CountDownLatch类:
可实现子进程等待主进程发起命令后竞争执行
(主线程调用countDown,子线程调用wait)
也可实现主线程等待子进程初始化完成后在执行
(主线程调用wait,子线程调用countDown)
class CountDownLatch : noncopyable{ public: explicit CountDownLatch(int count); void wait() { MutexLockGuard lock(mutex_); // 加锁 while (count_ > 0)// 等待条件 { condition_.wait();// 等待 } } void countDown() { MutexLockGuard lock(mutex_); --count_; if (count_ == 0) { condition_.notifyAll(); } } int getCount() const { MutexLockGuard lock(mutex_); return count_; } private: mutable MutexLock mutex_;// 声明为mutable的目的是因为getCount函数声明为const函数而该函数会改变锁的状态 Condition condition_; int count_;};
阅读全文
0 0
- Muduo库源码分析(5):互斥锁,条件变量类
- muduo源码分析:互斥锁、条件变量、倒计时封装
- [Muduo网络库源码分析] (2) base/Condition.cc_h_条件变量操作
- muduo源码学习(6)-锁,条件变量
- muduo库源码分析
- muduo库源码分析(3):异常类
- muduo库源码分析(4):线程类
- muduo源码分析(1):时间类
- muduo网络库源码学习————条件变量
- muduo源码分析---EventLoop类
- muduo源码分析--EventLoopThreadPool类
- muduo源码分析:ThreadLocalSigleton类
- muduo网络库之net库源码分析(1)
- Muduo库源码分析(7):线程池
- Muduo库源码分析(8):单例模式实现
- Muduo库源码分析(9):线程特定数据
- muduo源码分析:日志相关类(1)
- 学习muduo库之对互斥锁和条件变量的封装
- CSS3 icon font完全指南(CSS3 font 会取代icon图标)
- 怎么让父元素overflow:hidden的元素不被隐藏
- Codeforces-An impassioned circulation of affection (动态规划/尺取法)
- 生成链接打开窗口
- manacher算法&hdu3068
- Muduo库源码分析(5):互斥锁,条件变量类
- java程序员最常用的技术有哪些?
- Become A Hero HDU
- Anroid中基于TextView+PopWindow自定义下拉框样式,实现多级下拉框级联
- 【区块链】实体经济距离发行ICO还有多远?
- SpringBoot:spring boot 服务配置和部署
- IE下按钮超链接无法跳转
- 如何判断一个整数x是否可以表示成n个连续正整数的和
- <算法>基于三路划分的链表快速排序