muduo库阅读(4)——基本类型之条件变量
2015-11-08 17:38
281 查看
namespace muduo { /* * 条件变量 */ class Condition : boost::noncopyable { public: explicit Condition(MutexLock& mutex) : mutex_(mutex) { // 初始化 MCHECK(pthread_cond_init(&pcond_, NULL)); } ~Condition() { // 释放 MCHECK(pthread_cond_destroy(&pcond_)); } /* * 等待被唤醒 */ void wait() { // 先解除锁的持有 MutexLock::UnassignGuard ug(mutex_); //然后等待 MCHECK(pthread_cond_wait(&pcond_, mutex_.getPthreadMutex())); //等待成功之后,返回的时候,当前线程又会重新持有锁 } // returns true if time out, false otherwise. // 带超时的等待 bool waitForSeconds(int seconds); // 唤醒一个等待的线程 /* * pthread_cond_signal在多处理器上可能同时唤醒多个线程, * 当你只能让一个线程处理某个任务时,其它被唤醒的线程就需要继续 wait, * while循环的意义就体现在这里了, * 而且规范要求pthread_cond_signal至少唤醒一个pthread_cond_wait上 的线程, * 其实有些实现为了简单在单处理器上也会唤醒多个线程 */ void notify() { MCHECK(pthread_cond_signal(&pcond_)); } /* * 唤醒所有等待的线程 */ void notifyAll() { MCHECK(pthread_cond_broadcast(&pcond_)); } private: MutexLock& mutex_; // 条件变量的锁 pthread_cond_t pcond_; // 条件变量 }; }
// returns true if time out, false otherwise. // 带超时的等待 bool muduo::Condition::waitForSeconds(int seconds) { struct timespec abstime; // FIXME: use CLOCK_MONOTONIC or CLOCK_MONOTONIC_RAW to prevent time rewind. clock_gettime(CLOCK_REALTIME, &abstime); abstime.tv_sec += seconds; // 解除锁的持有 MutexLock::UnassignGuard ug(mutex_); //等待 return ETIMEDOUT == pthread_cond_timedwait(&pcond_, mutex_.getPthreadMutex(), &abstime); // 函数返回的时候,当前线程又会重新持有锁 }
相关文章推荐
- MySQL 一致性读 深入研究
- java 多线程安全问题-同步代码块
- Catalan数
- 第九周(11.02-11.08)学习笔记
- 以“结果是否成功”为判断标准过于表面,不如结合“过程是否科学”+“客观条件是否达到”
- Spring中的报错:no matching editors or conversion strategy found
- python之模块cmath
- lightoj1245 - Harmonic Number (II)【数学】
- 华为、阿里、京东使用的Java web框架是啥样的?
- 七种常见排序算法的总结
- c语言 参数个数可变函数
- [LeetCode] Binary Tree Paths
- React.js开发生态系统概览 [译-转]
- button按钮大小
- mjpg-streamer在pcduino上的应用
- C/C++内存泄漏及检测
- 阿里云推荐码
- (二)深入梯度下降(Gradient Descent)算法
- iOS开发-前言篇C-指针以、结构体指针、作用域
- 大数据流式计算:关键技术及系统实例