Если вы удерживаете мьютекс заблокированным, то пробуждаемый поток не может получить мьютекс, поэтому блокируется в pthread_cond_wait
, ожидая повторного получения мьютекса.
Вам не нужно удерживать мьютекс заблокированным для вызова pthread_cond_signal
. На самом деле, если логика вашего приложения может работать с сигналом, когда мьютекс не заблокирован, то это лучший способ сделать это - ОС может сразу планировать ожидающий поток, и ей не нужно ждать сигнализации поток, чтобы разблокировать мьютекс перед продолжением.
Тем не менее, в этом сценарии необходимо позаботиться о том, чтобы пробуждение не было потеряно, и у вас не было проблем с пробуждением «неправильного» потока. Если вы используете прямой предикат, на практике это не должно быть проблемой.