Я думаю, у вас есть несколько проблем здесь.С извинениями (я нахожусь на моем телефоне, поэтому набрать длинный ответ сложно) Я просто сосредоточусь на паре вещей, так как мне не на 100% ясно, что вы на самом деле пытаетесь сделать.
Когда все ваши потоки запускаются, они все пытаются получить мьютекс, и только один из них успешен.Возможно, но я не думаю, что здесь это гарантировано.Затем он вызывает pthread_cond_wait
и разблокирует мьютекс, позволяя одному из других потоков достичь его pthread_cond_wait
.Но пока.Вы позволили вашему основному потоку вызывать pthread_cond_broadcast
, и вы не предприняли никаких шагов для синхронизации этого с другими потоками.Это может произойти до того, как другие будут разблокированы в ожидании мьютекса, и до их wait
вызова, чтобы они могли пропустить сигнал и заблокировать навсегда.
Кроме того, я думаю, что немного набросать, чтобы немедленно вызвать pthread_cond_destroy
.Как я уже говорил, синхронизация между вашим основным потоком и рабочими потоками отсутствует, поэтому возможно, что вы могли бы вызвать pthread_cond_broadcast
, а затем pthread_cond_destroy
, поэтому некоторые из ваших потоков могут вызывать pthread_cond_wait
из-за недопустимой переменной условия и взаимоблокировки.
Проверьте возвращаемые значения pthread_cond_wait
.Если я прав, в некоторых случаях он может вернуть EINVAL
.Но я не проверял это, поэтому в моих рассуждениях может быть недостаток.