Производительность 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) и запустить его для своего кода.

Другие вопросы по тегам