muduo库阅读(4)——基本类型之条件变量

来源:互联网 发布:2017人工智能高峰论坛 编辑:程序博客网 时间:2024/06/15 10:34
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);// 函数返回的时候,当前线程又会重新持有锁}


0 0