您的位置:首页 > 其它

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);
// 函数返回的时候,当前线程又会重新持有锁
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: