Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Источник

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

также

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

Ответ 6

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

Я подробно рассказал в fooobar.com/questions/122738/...

Ответ 7

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

Ответ 8

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