在我的 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 何时返回?即有没有保证它只会在所有线程都被唤醒后才返回,或者它可以在之前返回吗?* 这个问题有什么推荐的解决方案吗?