.net - Diferencia entre Thread.Sleep(0) y Thread.Yield()
thread class c# (3)
Como Java ha tenido Sleep and Yield desde hace mucho tiempo, he encontrado answers para esa plataforma, pero no para .Net
.Net 4 incluye el nuevo método estático Thread.Yield (). Anteriormente, la forma común de entregar la CPU a otro proceso era Thread.Sleep (0).
Aparte de que Thread.Yield () devuelve un valor booleano, ¿existen otras diferencias en el rendimiento del sistema operativo?
Por ejemplo, no estoy seguro de si Thread.Sleep (0) comprueba si otro hilo está listo para ejecutarse antes de cambiar el hilo actual al estado de espera ... si ese no es el caso, cuando no hay otros hilos listos, Thread.Sleep (0) parecería peor que Thread.Yield ().
Como lo explicó Eric Lippert en el blog de coverity mientras demostraba cómo implementar el bloqueo - source
.NET Framework le brinda múltiples herramientas que puede usar para crear una estrategia de espera más sofisticada: Thread.SpinWait pone al procesador en un circuito cerrado que le permite esperar unos pocos nanosegundos o microsegundos sin ceder el control a otro hilo. Thread.Sleep (0) cede el control a cualquier subproceso listo de igual prioridad o continúa en el subproceso actual si no hay ninguno. Thread.Yield cedes el control a cualquier subproceso listo asociado con el procesador actual. Y como hemos visto, Thread.Sleep (1) cede el control a cualquier subproceso listo de la elección del sistema operativo. Al elegir cuidadosamente una combinación de estas llamadas y realizar pruebas de rendimiento en condiciones realistas, podría crear una implementación de alto rendimiento y, por supuesto, esto es lo que realmente ha hecho el equipo de CLR.
Según la MSDN,
Cuando se usa el modo de Sleep(0) El sistema operativo no programará la ejecución del subproceso durante el tiempo especificado.
Con el uso de Yield() Se obtiene el resto del intervalo de tiempo actual del hilo. El sistema operativo programa el subproceso de llamada para otro segmento de tiempo, de acuerdo con su prioridad y el estado de otros subprocesos que están disponibles para ejecutarse.
Así que hay una pequeña diferencia en eso. Thread.sleep colocará un Thread en el modo SLEEP con una recomendación de que permanezca allí durante la cantidad dada de milisegundos que Thread.yield lo pondrá en el modo WAIT para que pueda ejecutarse de nuevo inmediatamente, o un hilo de proceso superior podría intervenir.
Thread.Sleep(0)
abandona el segmento de tiempo actual del subproceso de forma inmediata, y entrega voluntariamente la CPU a otros subprocesos.
El nuevo método Thread.Yield()
Framework 4.0 hace lo mismo, excepto que solo se aplica a los subprocesos que se ejecutan en el mismo procesador.