В моей программе на C++ у меня есть класс CEvent с функциями запуска триггера и ожидания, основанный на pthreads (работает в Linux). Реализация довольно очевидна (т. Е. Много примеров в Интернете), если есть один процесс ожидания. Однако теперь мне нужно выполнить требование о том, что на событие ожидаются несколько потоков, и ВСЕ ДОЛЖНО просыпаться с надежностью при вызове trigger(). В качестве второго условия должны появляться только те потоки, которые ожидали, когда вызывался trigger().событие pthread пробуждение только ожидающих потоков
Мой текущий код:
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 другие (или те же) потоки, вызывающие wait(), также сразу просыпаются, что неприемлемо. Помещение wakeUp = false перед разблокировкой mutext предотвращает пробуждение потоков.
Мои вопросы: * Когда возвращается pthread_cond_broadcast? То есть есть ли гарантия, что он вернется только после того, как все потоки проснулись или могли бы вернуться раньше? * Есть ли рекомендованные решения этой проблемы?
Спасибо, это похоже на трюк. – 2009-05-28 12:53:09