c++ - seres - importancia del sueño pdf
Importancia del sueño(0) (8)
Solía ver Sleep(0)
en alguna parte de mi código donde algunos loops infinitos / largos están disponibles. Me informaron que pondría el segmento de tiempo disponible para otros procesos de espera. ¿Es esto cierto? ¿Hay algún significado para el Sleep(0)
?
De acuerdo con la documentación de MSDN para Sleep :
Un valor de cero hace que el subproceso renuncie al resto de su división de tiempo a cualquier otro subproceso que esté listo para ejecutarse. Si no hay otros subprocesos listos para ejecutarse, la función regresa inmediatamente y el subproceso continúa la ejecución.
Lo importante es darse cuenta de que sí, esto le da la oportunidad a otros subprocesos de ejecutarse, pero si no hay ninguno listo para ejecutarse, el hilo continúa, dejando el uso de la CPU al 100%, ya que algo siempre se ejecutará. 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.
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).
Estoy usando el uso de pthreads y por alguna razón en mi mac el compilador no encuentra pthread_yield () para ser declarado. Pero parece que dormir (0) es lo mismo.
Me temo que no puedo mejorar los Sleep aquí
Un valor de cero hace que el subproceso renuncie al resto de su división de tiempo a cualquier otro subproceso que esté listo para ejecutarse. Si no hay otros subprocesos listos para ejecutarse, la función regresa inmediatamente y el subproceso continúa la ejecución.
Windows XP / 2000: un valor de cero hace que el subproceso renuncie al resto de su división de tiempo a cualquier otro subproceso de igual prioridad que esté listo para ejecutarse. Si no hay otros hilos de igual prioridad listos para ejecutarse, la función regresa inmediatamente y el hilo continúa la ejecución. Este comportamiento cambió a partir de Windows Server 2003.
Por favor, también tenga en cuenta (vía upvote) las dos respuestas útiles sobre problemas de eficiencia aquí.
Sí, le da la oportunidad a otros hilos de correr.
Un valor de cero hace que el subproceso renuncie al resto de su división de tiempo a cualquier otro subproceso que esté listo para ejecutarse. Si no hay otros subprocesos listos para ejecutarse, la función regresa inmediatamente y el subproceso continúa la ejecución.
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.
He dado algunos detalles en https://.com/a/11456112/1504523
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.
Sleep(0);
En esa instrucción, el planificador del sistema verificará si hay otros subprocesos ejecutables y posiblemente les dé la oportunidad de usar los recursos del sistema dependiendo de las prioridades del subproceso.
En Linux hay un comando específico para esto: sched_yield()
partir de las páginas man:
sched_yield()
hace que el hilo de llamada renuncie 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 de llamada es el único hilo en la lista de prioridad más alta en ese momento, continuará ejecutándose después de una llamada a
sched_yield()
.
con también
Las llamadas estratégicas a
sched_yield()
pueden mejorar el rendimiento al dar a otros subprocesos o procesos la oportunidad de ejecutarse cuando la persona que llama libera recursos (pesadamente) controvertidos (por ejemplo, mutexes). Evite llamar asched_yield()
innecesaria o inapropiada (por ejemplo, cuando la persona que llama sigue teniendo recursos necesarios para otros hilos programables), ya que al hacerlo se producirán interruptores de contexto innecesarios, lo que degradará el rendimiento del sistema.