Мьютексы используются для обеспечения монопольного доступа, где в качестве переменных условия используются для синхронизации потоков на основе событий.
Нам нужны мьютексы, чтобы гарантировать, что условные переменные не окажутся в бесконечном ожидании.
Следует помнить одну вещь: операции блокировки и разблокировки Mutex гарантированно будут атомарными, но переменные условия не обязательно должны быть. Т.е. поток может быть запланирован, пока условная переменная ожидания находится на полпути.
Рассмотрим следующий случай без Mutex для условной переменной.
Тема 1
1) Выполнить некоторые операции
2) Ожидание переменной условия
3) Продолжение операции
Тема 2
1) Выполнить некоторую операцию
2) Сигнализировать переменную условия
3) Продолжить операцию
Здесь, в потоке 1, шаг 2 не обязательно должен быть атомарным. Если Поток 1 выведен из состояния RUNNING планировщиком до завершения шага 1.
Теперь поток 2 начинает выполнение и сигнализирует переменную условия. Когда поток 1 возобновляет выполнение, он заканчивает оставшиеся инструкции низкого уровня и начинает ждать.
Поток 1 заканчивается бесконечным ожиданием, так как сигнал переменной условия возник еще до ожидания.
Таким образом, правильный способ использования (я думаю, что код, упомянутый в вопросе, не соответствует ожидаемому)
Тема 1: -
1) Работайте до момента, когда должно произойти определенное условие (например, «count» должен достичь определенного значения)
2) Блокировка связанного мьютекса
3) Вызовите pthread_cond_wait (), чтобы выполнить ожидание блокировки для потока из Thread1.
(Обратите внимание, что вызов pthread_cond_wait () автоматически и атомарно разблокирует связанную переменную мьютекса, чтобы она могла использоваться Thread2)
4) Проснувшись, проснись. Мьютекс автоматически и атомно заблокирован.
5) Явно разблокировать мьютекс
Резьба2
1) Работать
2) Блокировка ассоциированного мьютекса
3) Измените значение глобальной переменной, которую ожидает Thread1.
4) Проверьте значение глобальной переменной ожидания Thread1. Если он удовлетворяет требуемому условию, подайте сигнал Thread1.
5) Разблокировать мьютекс.
Продолжить