Я не знаю каких-либо подробностей о реализации pthreads или D, но в общих чертах наилучшие издержки для условной переменной - это один дополнительный вызов ядра и возможное переключение контекста.
Типичная реализация - это просто оболочка для событий и мьютексов, поэтому издержки и временные характеристики могут быть охарактеризованы поведением этих объектов ядра. При ожидании поток отдает оставшуюся часть запланированного кванта времени, а при пробуждении поток назначается ядром и получает следующий доступный квант времени на основе своего приоритета. Это сильно зависит от нагрузки и конфигурации ядра, но обычно составляет несколько миллисекунд.
Для условной переменной существует дополнительная задача по повторному получению мьютекса, который, конечно, может блокироваться. Если это не блокирует, то это все еще вызов ядра. Это может в конечном итоге быть оптимизировано до нескольких атомарных команд ЦП, которые очень быстры по сравнению, но ограничены одним процессом. [ed: CRITICAL_SECTION в Win32 или futex в Linux, например.]
Наихудший случай - случайная переменная условия, и поток просыпается только для того, чтобы обнаружить, что ничего не нужно делать, но это, как правило, составляет незначительную долю от общего объема служебных данных.