В моей программе на 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 (), также сразу же проснутся, что недопустимо. Установка wakeUp = false до разблокировки мьютекста предотвращает пробуждение потоков.
Мои вопросы:
* Когда возвращается pthread_cond_broadcast? То есть есть ли гарантия, что он вернется только после того, как все потоки проснулись, или он мог вернуться раньше?
* Есть ли рекомендуемые решения этой проблемы?