DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 


// Interface of Waiter, also takes care of mutex_ & cond_ init and destroy.
class Waiter : boost::noncopyable
{
public:
virtual void wait() = 0;
virtual void signal() = 0;

protected:
Waiter()
{
pthread_mutex_init(&mutex_, NULL);
pthread_cond_init(&cond_, NULL);
}

~Waiter()
{
pthread_mutex_destroy(&mutex_);
pthread_cond_destroy(&cond_);
}

pthread_mutex_t mutex_;
pthread_cond_t cond_;
};

 

// Version 7: broadcast to wakeup multiple waiting threads
// Probably the best version among above.
class Waiter7 : public Waiter
{
public:
void wait() override
{
pthread_mutex_lock(&mutex_);
while (!signaled_)
{
pthread_cond_wait(&cond_, &mutex_);
}
pthread_mutex_unlock(&mutex_);
}

void signal() override // Sorry, bad name in base class, poor OOP
{
broadcast();
}

void broadcast()
{
pthread_mutex_lock(&mutex_);
pthread_cond_broadcast(&cond_);
signaled_ = true;
pthread_mutex_unlock(&mutex_);
}

private:
bool signaled_ = false;
};

posted on 2019-08-28 14:07  DoubleLi  阅读(460)  评论(0编辑  收藏  举报