Значение сна (0) - PullRequest
       36

Значение сна (0)

43 голосов
/ 16 сентября 2010

Раньше я видел Sleep(0) в некоторой части моего кода, где доступны бесконечные / длинные циклы while. Мне сообщили, что это сделает временной интервал доступным для других процессов ожидания. Это правда? Есть ли какое-то значение для Sleep(0)?

Ответы [ 8 ]

46 голосов
/ 16 сентября 2010

В соответствии с документацией MSDN для Sleep :

При значении, равном нулю, поток освобождает остаток своего временного интервала от любого другого потока, готового к запуску.Если нет других потоков, готовых к запуску, функция немедленно возвращается и поток продолжает выполнение.

Важно понимать, что да, это дает возможность другим потокам запускаться, но еслинет готовых к запуску, затем ваш поток продолжает работу, оставляя загрузку ЦП на уровне 100%, поскольку что-то всегда будет работать.Если ваш цикл while просто вращается во время ожидания какого-либо условия, вы можете рассмотреть возможность использования примитива синхронизации, такого как событие для сна, пока условие не будет выполнено, или для сна в течение небольшого промежутка времени, чтобы предотвратить максимальную загрузку ЦП.

17 голосов
/ 16 сентября 2010

Да, это дает возможность другим потокам запускаться.

Значение ноль заставляет поток передавать оставшуюся часть своего временного интервала любому другому потоку, который готов к работе.Если нет других потоков, готовых к запуску, функция немедленно возвращается и поток продолжает выполнение.

Источник

14 голосов
/ 16 сентября 2010

Будьте осторожны с Sleep (0), если время выполнения одной итерации цикла короткое, это может значительно замедлить такой цикл.Если это важно для его использования, вы можете вызывать Sleep (0), например, один раз за 100 итераций.

14 голосов
/ 16 сентября 2010

Боюсь, что я не могу улучшить MSDN документы здесь

Значение ноль заставляет поток отказаться от оставшейся части своего временного интервала для любого другогонить, которая готова к запуску.Если нет других потоков, готовых к запуску, функция немедленно возвращается и поток продолжает выполнение.

Windows XP / 2000: нулевое значение заставляет поток отказаться от оставшейся части своего временного интервала для любого другогопоток с равным приоритетом, который готов к запуску.Если нет других потоков с равным приоритетом, готовых к запуску, функция немедленно возвращается и поток продолжает выполнение.Это поведение изменилось, начиная с Windows Server 2003.

Пожалуйста, обратите внимание (через upvote) на два полезных ответа относительно проблем эффективности здесь.

3 голосов
/ 06 ноября 2013

Sleep(0); По этой инструкции системный планировщик проверит наличие любых других выполняемых потоков и, возможно, даст им возможность использовать системные ресурсы в зависимости от приоритетов потоков.

В Linux есть специальная команда для этого: sched_yield() как на страницах руководства:

sched_yield() заставляет вызывающий поток освободить ЦП. поток перемещается в конец очереди для его статического приоритета и новый поток запускается.

Если вызывающий поток является единственным потоком в списке с самым высоким приоритетом в это время он продолжит работать после вызова sched_yield().

с также

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

2 голосов
/ 29 апреля 2014

В одном приложении .... основной поток искал что делать, затем запускал "работу" через новый поток. В этом случае вы должны вызвать sched_yield () (или sleep (0)) в главном потоке, чтобы вы не делали «поиск» работы, более важной, чем «работа». Я предпочитаю спать (0), но иногда это чрезмерно (потому что вы спите доли секунды).

1 голос
/ 13 июля 2012

Sleep (0) - мощный инструмент, который в некоторых случаях может повысить производительность.Использование его в быстром цикле может быть рассмотрено в особых случаях.Когда набор потоков должен быть максимально отзывчивым, все они должны часто использовать Sleep (0).Но очень важно найти линейку для того, что означает адаптивность в контексте кода.

Я дал некоторые детали в https://stackoverflow.com/a/11456112/1504523

0 голосов
/ 24 февраля 2014

Я использую pthreads и по какой-то причине на моем mac компилятор не находит pthread_yield () для объявления. Но похоже, что sleep (0) - это то же самое.

...