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

Разница между Thread.Sleep(0) и Thread.Yield()

Поскольку у Java уже давно есть Sleep and Yield, я нашел ответы для этой платформы, но не для .Net

.Net 4 включает новый статический метод Thread.Yield(). Раньше общим способом передать процессор другому процессу был Thread.Sleep(0).

Помимо Thread.Yield(), возвращающего логическое значение, есть ли другая производительность, различия внутри внутренних компонентов?

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

4b9b3361

Ответ 1

Как объяснил Эрик Липперт в блоге обложки, демонстрируя, как реализовать блокировку - источник

.NET Framework предоставляет вам несколько инструментов, которые вы могли бы использовать для построения более сложной стратегии ожидания: Thread.SpinWait ставит процессор в замкнутый цикл, позволяя подождать несколько наносекунд или микросекунды, не передавая управление другому потоку. Thread.Sleep(0) cedes контролирует любой готовый поток с равным приоритетом или продолжает текущий поток, если его нет. Thread.Yield привязывается к любому готовому потоку, связанному с текущим процессором. И, как мы видели, Thread.Sleep(1) привязывается к любому готовому потоку выбора операционной системы. Тщательно выбирая сочетание этих вызовов и проверив тестирование производительности в реальных условиях, вы можете создать высокопроизводительную реализацию, и, конечно же, именно это сделала команда CLR.

Ответ 2

Согласно MSDN,

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

Используя Выход() Получается остальная часть текущего временного среза потока. Операционная система рассылает вызывающий поток для другого временного фрагмента в соответствии с его приоритетом и статусом других потоков, которые доступны для запуска.

В этом есть небольшая разница. Thread.sleep поместит Thread в режим SLEEP с рекомендацией, что он останется там для заданного количества миллисекунд Thread.yield поместит его в режим WAIT, чтобы он мог работать сразу, или может произойти более высокий поток процесса.

Ответ 3

Thread.Sleep(0) немедленно отказывается от текущего временного среза потоков, добровольно передавая CPU другим потокам.

Новый метод Thread.Yield() Framework 4.0s делает то же самое, за исключением того, что он отказывается только от потоков, работающих на процессоре того же.

источник