Функция pthread_cond_signal
не приводит к тому, что текущий поток уступает, и не освобождает мьютекс. Все, что он делает, это перезапускает один поток, который приостановил свое состояние с помощью pthread_cond_wait
. Это просто означает, что пробужденный поток доступен для планирования, но не вызывает его немедленного выполнения. Планировщик потока запланирует это когда-нибудь в будущем.
Кроме того, только потому, что s-поток был пробужден и борется за мьютекс, это не значит, что он получит мьютекс следующим. Мьютексы не обязательно справедливы для всех потоков, которые его запрашивали. Согласно справочной странице pthread_mutex
: «pthread_mutex_lock
блокирует данный мьютекс. Если мьютекс в настоящее время разблокирован, он становится заблокированным и принадлежит вызывающему потоку, и pthread_mutex_lock
немедленно возвращается». Таким образом, r-поток может вращаться в своем цикле несколько раз, с радостью разблокируя и снова блокируя мьютекс несколько раз, прежде чем он будет заменен планировщиком. Это означает, что s-поток получит шанс на мьютекс, только если планировщик прервет r-поток в течение короткого времени, в течение которого он освободил мьютекс.
Чтобы получить желаемый результат, оба потока должны будут контролировать свое выполнение с условием и сигнализировать друг другу, прежде чем приостановить себя. Тем не менее, это может или не может быть то, что вы на самом деле хотите сделать со своим реальным проектом.
Еще одно замечание: не имеет значения, в каком порядке вы создали потоки. Создание потока не приводит к созданию потока. Таким образом, главный поток, вероятно, создаст оба потока до того, как любой из них будет запланирован, и планировщик потока может свободно планировать любой из них для выполнения следующим. Если s-поток запускается первым на вашей платформе, то это просто поведение реализации на вашей платформе, и на него нельзя полагаться.