2010-09-16 11 views
36

Solía ​​ver Sleep(0) en alguna parte de mi código donde hay lazos infinitos/largos while disponibles. Me informaron que pondría el segmento de tiempo disponible para otros procesos de espera. ¿Es esto cierto? ¿Hay algún significado para Sleep(0)?Importancia del sueño (0)

+2

Con C++ 11, tiene una mejor plataforma independiente para hacer eso: ['std :: this_thread :: yield()'] (http://en.cppreference.com/w/cpp/thread/ rendimiento)! – iammilind

Respuesta

37

De acuerdo con la documentación de MSDN para Sleep:

Un valor de cero hace que el hilo para renunciar al resto de su porción de tiempo a cualquier otro hilo que es listo para funcionar. Si no hay otros subprocesos listos para ejecutarse, la función vuelve inmediatamente y la secuencia continúa la ejecución.

Lo importante es darse cuenta de que sí, esto da a otros hilos oportunidad de correr, pero si no hay ninguna lista para funcionar, a continuación, el hilo continúa - dejando el uso de la CPU al 100% desde algo siempre estará funcionando. Si su ciclo while está girando mientras espera alguna condición, puede considerar utilizar una primitiva de sincronización como un evento para dormir hasta que se cumpla la condición o dormir por un período de tiempo limitado para evitar que la CPU se maximice.

17

Sí, le da la oportunidad a otros subprocesos de funcionar.

Un valor de cero hace que el hilo para renunciar al resto de su porción de tiempo a cualquier otro hilo que es listo para funcionar. Si no hay otros subprocesos listos para ejecutarse, la función vuelve inmediatamente y la secuencia continúa la ejecución.

Source

14

Me temo que no puedo mejorar en el MSDN docs aquí

Un valor de cero hace que el hilo para renunciar al resto de su porción de tiempo a cualquier otro hilo que es listo para funcionar. Si no hay otros subprocesos listos para ejecutarse, la función vuelve inmediatamente y la secuencia continúa la ejecución.

Windows XP/2000: Un valor de cero hace que el hilo para renunciar a la resto de su porción de tiempo a cualquier otro hilo de la misma prioridad que es listo para funcionar. Si no hay otros hilos de prioridad igual listos para ejecutar, la función vuelve inmediatamente, y el hilo continúa la ejecución. Este comportamiento se cambió a partir con Windows Server 2003.

Tenga en cuenta también (a través de upvote) las dos respuestas útiles con respecto a los problemas de eficiencia aquí.

13

Tenga cuidado con Sleep (0), si el tiempo de ejecución de una iteración de bucle es corto, esto puede ralentizar dicho bucle significativamente.Si esto es importante para usarlo, puede llamar a Sleep (0), por ejemplo, una vez cada 100 iteraciones.

+2

No veo cómo podría tener sentido poner un Sleep (0) en un bucle que también se supone que es rápido. – sellibitze

+0

sellibitze: Quiero decir, una iteración es rápida, y no todo el ciclo. –

+0

@sellibitze: Considera el modo híbrido de dormir/ocupado-espera. Esto es bastante común para el código sensible a la temporización no crítico que no quiere encerrar a la CPU, aunque la heurística suele ser algo más sofisticado, como solo dormir si espera que la próxima fecha límite sea> n-muchos ms en el futuro . –

1

Sleep (0) es una herramienta poderosa y puede mejorar el rendimiento en ciertos casos. Usarlo en un ciclo rápido podría considerarse en casos especiales. Cuando un conjunto de hilos responda al máximo, todos usarán Sueño (0) con frecuencia. Pero es fundamental encontrar una regla para lo que significa respuesta en el contexto del código.

me he dado algunos detalles en https://stackoverflow.com/a/11456112/1504523

2

Sleep(0); En esa instrucción, el programador del sistema verificará si hay otros subprocesos ejecutables y posiblemente darles la oportunidad de utilizar los recursos del sistema en función de las prioridades de subprocesos.

En Linux hay un comando específico para esto: sched_yield() como de las páginas man:

sched_yield() hace que el subproceso de llamada a renunciar a la CPU. El subproceso se mueve al final de la cola para su prioridad estática y se ejecuta un nuevo subproceso .

Si el hilo que llama es el único hilo en la lista de prioridad más alta en ese momento, continuará ejecutándose después de una llamada al sched_yield().

con el también

llamadas estratégicas a sched_yield() pueden mejorar el rendimiento, dando otros hebras o procesos oportunidad de correr cuando (en gran medida) sostuvo recursos (por ejemplo, mutex) han sido puestos en libertad por la persona que llama . evitar llamar sched_yield() innecesariamente o inapropiadamente (por ejemplo, cuando recursos necesarios por otros temas que se pueden programar todavía están en manos de la persona que llama ), ya que al hacerlo resultará en cambios de contexto innecesarios, que degradar el rendimiento del sistema.

+0

Y en Windows también tenemos 'SwitchToThread()' –

0

Estoy usando el uso de pthreads y por alguna razón en mi mac el compilador no encuentra que pthread_yield() sea declarado. Pero parece que dormir (0) es lo mismo.

1

En una aplicación .... el hilo principal buscaba cosas que hacer, luego lanzó el "trabajo" a través de un nuevo hilo. En este caso, debe llamar a sched_yield() (o sleep (0)) en el hilo principal, de modo que no busque "buscar" trabajo, más importante que el "trabajo". Prefiero dormir (0), pero a veces esto es excesivo (porque estás durmiendo una fracción de segundo).

Cuestiones relacionadas