2013-09-08 12 views
2

Если я вызываю pthread_cond_broadcast и никто не ожидает этого условия, будет ли pthread_cond_broadcast вызывать контекстный переключатель и/или вызывать ядро?Производительность pthread_cond_broadcast, когда никто не ждет при условии

Если нет, могу ли я полагаться на то, что это очень быстро (по быстрому я имею в виду, просто выполняю небольшое количество assmebly-инструкции в текущем процессе и затем возвращаюсь)?

+0

Как насчет того, чтобы самостоятельно измерять его с помощью профилировщика, а затем вернуться и обсудить результаты? – alk

ответ

2

Там нет никаких гарантий в POSIX, но так как ваш вопрос помечен линукс и NPTL ответ в этом контексте может быть дано.

Если в переменной условия нет официантов, то nptl glibc code for pthread_cond_broadcast() просто берет блокировку низкого уровня, защищающую внутренности самой переменной условия, проверяет значение, а затем блокирует блокировку нижнего уровня. Сама блокировка самого низкого уровня использует futex, который будет вводить ядро ​​только в том случае, если на этой блокировке есть конкуренция.

Это означает, что если не существует большого разногласия относительно самой переменной условия (то есть большое количество потоков, часто вызывающих pthread_cond_broadcast()/pthread_cond_signal() с той же переменной условия), системный вызов ядра не будет Накладные расходы - это всего лишь несколько заблокированных инструкций.

1

pthread The Open Group Base спецификации говорится:

В pthread_cond_broadcast() и pthread_cond_signal() функции не будут иметь никакого эффекта, если нет нити в настоящее время заблокированы на cond.

Чтобы получить меру ли это берет «просто работает небольшое количество assmebly [так] инструкция» Вы должны выйти некоторые во время выполнения инструмент производительности анализа (например Quantify компании IBM) и запустить его против вашего кода.