Ожидание и пробуждение обычно выполняются в сотрудничестве с планировщиком.Реализация мьютекса, которая вызывает конкретный ожидающий поток для пробуждения, как правило, считается плохой реализацией.
Вместо этого мьютекс или семафор уведомит планировщик о том, что поток ожидает, и, следовательно, принять егоиз списка "готов к запуску".Затем, когда мьютекс разблокирован или сигнализирован семафор, реализация либо
попросит планировщика разбудить один из ожидающих потоков по усмотрению планировщика, либо
уведомляет планировщик о том, что все ожидающие потоки готовы к запуску, а затем имеет логику в ожидающих потоках, чтобы все, кроме первого, разбудившегося планировщиком, снова возвращались в спящий режим.
Первый вариант является предпочтительным вариантом реализации, но не всегда доступен.Второе часто называют подходом «гремящего стада»: если ожидается 1000 потоков, то просыпаются все 1000 (большое грохочущее стадо потоков), и только 999 человек возвращаются в спящий режим.Это бесполезно расходует ресурсы ЦП, и реализации по возможности будут избегать этого.