Ответ 1
Быстрый ответ:
pthread_cond_signal()
пробудит хотя бы один поток, который заблокирован в переменной условия, но больше этого не гарантируется (для справки используйте pthread_cond_broadcast()
для пробуждения всех заблокированных потоков).
Из здесь:
Вызов pthread_cond_signal() разблокирует хотя бы один из потоков которые блокируются при заданной переменной условия cond (если есть потоки блокируются на cond).
Вызов pthread_cond_broadcast() блокирует все потоки в настоящее время заблокирован при заданной переменной условия cond.
Более длинный ответ:
Итак, согласно спецификации, я предполагаю, что разблокировка произойдет синхронно, то есть поток, который был разблокирован первым вызовом pthread_cond_signal()
, будет считаться разблокированным вторым вызовом pthread_cond_signal()
, и, таким образом, другая нить будет разбужена.
Однако я не знаю, так ли это для вашей конкретной реализации pthread или нет (и на данный момент сайт glibc довольно хитроумный, поэтому не может получить доступ к коду, который нужно посмотреть).
Ответ, возможно, еще не реализованный, но-он-в-спецификации:
Следует отметить, однако, что спецификация недавно немного изменилась в отношении того, как pthread_cond_signal()
и pthread_cond_broadcast()
определяют, какие потоки фактически блокируются при заданной переменной условия, но я полагаю, что не все реализации до сих пор догнали.
Длинную дискуссию по этому вопросу можно найти здесь, с новой спецификацией:
Функции pthread_cond_broadcast() и pthread_cond_signal() атомически определяет, какие потоки, если таковые имеются, блокируются на заданной переменной условия cond. Это определение должны произойти в неустановленное время в течение pthread_cond_broadcast() или pthread_cond_signal(). Функция pthread_cond_broadcast() должна разблокировать все эти потоки. Функция pthread_cond_signal() должна разблокировать хотя бы один из этих потоков.
Итак, вывод:
Не являясь экспертным интерпретатором спецификаций, я бы сказал, что новый текст поддерживает предположение об этом синхронно - чтобы два последовательных вызова pthread_cond_signal()
с двумя доступными доступными потоками, пробуждали оба потока.
Я не уверен на это на 100%, поэтому, если кто-то может разработать, не стесняйтесь это делать.