Yo solía ver Sleep(0) en alguna parte de mi código donde algunos infinito/largo while bucles están disponibles. Se me informó que sería hacer un time-slice disponible para otros procesos en espera. ¿Es esto cierto? ¿Hay algún significado para Sleep(0)?

InformationsquelleAutor bdhar | 2010-09-16

8 Comentarios

  1. 48

    De acuerdo a la documentación de MSDN para El sueño:

    Un valor de cero hace que el subproceso
    renunciar al resto de su tiempo
    sector a cualquier otro hilo que es
    listo para ejecutar. Si no hay ningún otro
    hilos listos para ejecutar la función
    devuelve inmediatamente, y el hilo
    continúa la ejecución.

    Lo importante es darse cuenta de que sí, de esta manera otros hilos de una oportunidad de correr, pero si no hay ninguno listo para ejecutar, a continuación, la conversación continúa, dejando el uso de CPU al 100% desde algo siempre va a estar en ejecución. Si el bucle while es simplemente girando espera de que alguna condición, usted puede ser que desee considerar el uso de un primitivo de sincronización como un evento a dormir hasta que la condición se cumple o el sueño de una pequeña cantidad de tiempo para evitar el gasto excesivo de la CPU.

    • Se garantiza windows para poner cualquier superior o del mismo nivel de subproceso de prioridad de la cpu después de llamar a dormir(0)? Y ¿cuánto tiempo se tarda en microsegundos o nanosegundos?
  2. 17

    Sí, se da a los otros hilos de la posibilidad de ejecutar.

    Un valor de cero hace que el subproceso
    renunciar al resto de su tiempo
    sector a cualquier otro hilo que es
    listo para ejecutar. Si no hay ningún otro
    hilos listos para ejecutar la función
    devuelve inmediatamente, y el hilo
    continúa la ejecución.

    Fuente

  3. 14

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

    Un valor de cero hace que el subproceso
    renunciar al resto de su tiempo
    sector a cualquier otro hilo que es
    listo para ejecutar. Si no hay ningún otro
    hilos listos para ejecutar la función
    devuelve inmediatamente, y el hilo
    continúa la ejecución.

    Windows XP/2000: UN valor de cero
    hace que el hilo de abandonar la
    resto de su segmento de tiempo a cualquier
    otro hilo de la misma prioridad que es
    listo para ejecutar. Si no hay ningún otro
    hilos de igual prioridad listo para
    ejecutar, la función devuelve inmediatamente,
    y el hilo continúa la ejecución.
    Este comportamiento ha cambiado de partida con
    Windows Server 2003.

    Por favor, también tenga en cuenta (a través de upvote) las dos respuestas útiles en cuanto a la eficiencia de los problemas aquí.

  4. 14

    Ser cuidadoso con el Sueño(0), si una iteración del bucle de ejecución el tiempo es corto, esto puede ralentizar la velocidad de bucle significativamente. Si esto es importante para el uso, usted puede llamar a Dormir(0), por ejemplo, una vez por cada 100 iteraciones.

    • No veo cómo podría alguna vez hacer sentido poner un Sleep(0) en un bucle en el que también se supone que ser rápido.
    • sellibitze: quiero decir, una iteración es rápido, y no a todo el bucle.
    • Considere la posibilidad de la suspensión híbrida/ocupado-esperar. Esto es bastante común que no sean de misión crítica de temporización sensible código que no quiere acaparar la CPU, a pesar de que la heurística es generalmente algo más sofisticado, como sólo dormir, si se espera que la próxima iteración de la fecha límite para ser > n-muchos ms en el futuro.
  5. 3

    Sleep(0); En que la instrucción, el programador del sistema se compruebe cualquier otro ejecutable hilos y posiblemente darles una oportunidad de utilizar el sistema de recursos en función de prioridades de subprocesos.

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

    sched_yield() hace que el subproceso de llamada a renunciar a la CPU. El
    el hilo se mueve a la final de la cola para su prioridad estática y una
    nuevo hilo llega a ejecutar.

    Si el subproceso de llamada es el único hilo en el más alto de la lista de prioridades
    en ese momento, éste seguirá funcionando después de una llamada a sched_yield().

    con también

    Estratégico llamadas a sched_yield() puede mejorar el rendimiento, dando
    otros subprocesos o procesos de una oportunidad para que se ejecute cuando (fuertemente) sostuvo
    recursos (por ejemplo, los mutexes) se han publicado por el autor de la llamada. Evitar
    llamar sched_yield() innecesaria o inapropiada (por ejemplo, cuando
    recursos necesarios por otros puede programar los hilos están todavía en manos de la
    llamador), ya que ello dará como resultado innecesarios cambios de contexto,
    que va a degradar el rendimiento del sistema.

  6. 2

    En una aplicación….el hilo principal buscaban cosas que hacer, luego puso en marcha el «trabajo» a través de un nuevo hilo. En este caso, usted debe llamar a sched_yield () () o sleep(0)) en el hilo principal, así que usted no hace la «mirando» para el trabajo, más importante que el «trabajo». Yo prefiero dormir(0), pero a veces es excesivo (porque usted está durmiendo en una fracción de segundo).

  7. 1

    Sleep(0) es una poderosa herramienta que puede mejorar el rendimiento en algunos casos. Usarlo en un lazo rápido puede ser considerado en casos especiales. Cuando un conjunto de hilos que se tenga la mayor capacidad de respuesta, se debe utilizar Sleep(0) con frecuencia. Pero es crutial para encontrar una regla para lo sensible significa en el contexto del código.

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

  8. 0

    Estoy usando con pthreads y por alguna razón en mi mac el compilador no es encontrar pthread_yield() para ser declarado. Pero parece que el sueño(0) es la misma cosa.

Dejar respuesta

Please enter your comment!
Please enter your name here