У меня есть простое приложение с потоком «менеджер», в котором появляются десять простых «рабочих» потоков. Я хочу, чтобы все «рабочие» потоки блокировались при одной и той же переменной условия (то есть: condvar), и я хочу вручную сигнализировать все десять потоков, чтобы просыпаться одновременно с вызовом pthread_cond_broadcast.Синхронизация потоков для вызова pthread_cond_broadcast
В случае моего приложения, потоки могут страдать от ошибки и заканчиваться раньше, так что возможно, что не все десять потоков попадают в точку синхронизации.
Одним простым механизмом является создание pthread_barrier_t и все десяти потоков, вызывающих pthread_barrier_wait, и когда все десять потоков завершат этот вызов, они могут продолжить выполнение. Однако для этого потребуется, чтобы потоки могли изменять количество потоков, которые барьер требует разблокировать. Я не знаю, можно ли это безопасно изменить.
Кроме того, я хочу, чтобы все неподвижные потоки не запускались автоматически, как если бы они были с барьером, я хочу вручную запустить их с помощью вызова pthread_cond_broadcast. Как я могу гарантировать, что все потоки, которые все еще живы (в идеале десять) заблокированы на конвале, прежде чем я сделал широковещательный вызов?
Спасибо!
Я действительно не понимаю вашу проблему. Чтобы разбудить всех, кто ждет переменную cond, вы просто используете 'pthread_cond_broacast'. Это разбудит всех, кто все еще там. Вы хотите убедиться, что все на самом деле ждут переменную cond, или какова ваша проблема? –
Это правильно, я хочу, чтобы все ждали. Проблема в том, что некоторые, возможно, уже умерли, поэтому я хочу, чтобы все те, кто все еще жив, ожидали. – DevNull