Производительность pthread_cond_broadcast, когда никто не ждет при условии
Если я вызываю pthread_cond_broadcast, и никто не ждет выполнения условия, вызовет ли pthread_cond_broadcast переключение контекста и / или вызов ядра?
Если нет, могу ли я рассчитывать на то, что он будет очень быстрым (под быстрым я имею в виду, просто выполняя небольшое количество кратких инструкций в текущем процессе, а затем возвращаясь)?
2 ответа
В POSIX нет никаких гарантий, но, поскольку ваш вопрос помечен как linux и nptl, ответ в этом контексте может быть дан.
Если в условной переменной нет официантов, то код nptl glibc дляpthread_cond_broadcast()
просто берет низкоуровневую блокировку, защищающую внутреннюю часть самой переменной условия, проверяет значение, а затем разблокирует низкоуровневую блокировку. Сама низкоуровневая блокировка использует futex, который войдет в ядро, только если есть конфликт на этой блокировке.
Это означает, что, если нет большой разногласий по поводу самой переменной условия (т. Е. Большое количество потоков часто вызывает pthread_cond_broadcast()
/ pthread_cond_signal()
для одной и той же условной переменной) системный вызов ядра не будет, а накладными расходами будут только несколько заблокированных инструкций.
pthread
Открытые базовые технические характеристики группы:
pthread_cond_broadcast()
а такжеpthread_cond_signal()
функции не будут иметь эффекта, если в данный момент нет заблокированных потоковcond
,
Чтобы измерить, требуется ли для этого "просто выполнение небольшого количества ассемблерных [sic] инструкций", вам нужно получить какой-нибудь инструмент анализа производительности во время выполнения (например, IBM Quantify) и запустить его для своего кода.