【发布时间】:2010-10-29 12:34:54
【问题描述】:
在我的 C++ 程序中,我有一个 CEvent 类,它带有基于 pthreads 的触发器和等待成员函数(在 Linux 上运行)。如果有一个等待过程,实现是非常明显的(即网上有很多例子)。但是现在我需要满足多个线程正在等待事件的要求,并且在调用 trigger() 时应该全部可靠地唤醒。作为第二个条件,只有在调用 trigger() 时正在等待的线程才会被唤醒。
我当前的代码:
void CEvent::trigger() {
pthread_mutex_lock(&mutex);
wakeUp = true;
pthread_cond_broadcast(&condition)
pthread_mutex_unlock(&mutex);
wakeUp = false;
}
void CEvent::wait() {
pthread_mutex_lock(&mutex);
while (!wakeUp)
pthread_cond_wait(&condition, &mutex)
pthread_mutex_unlock(&mutex);
}
这似乎几乎可以工作,因为在我将 wakeUp 设置回 false 之前等待唤醒的所有线程。但是在广播和wakeUp 的重置之间,调用wait() 的其他(或相同)线程也将立即唤醒,这是不可接受的。在 mutext 解锁之前设置 wakeUp = false 可以防止线程唤醒。
我的问题: * pthread_cond_broadcast 什么时候返回? IE。有没有保证它只会在所有线程都唤醒后才返回,或者它可以在之前返回? * 这个问题有什么推荐的解决方案吗?
【问题讨论】: