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