27 votes

Importance du sommeil (0)

J'avais l'habitude de voir Sleep(0) dans une partie de mon code où des boucles while infinies / longues sont disponibles. J'ai été informé que cela rendrait la tranche de temps disponible pour d'autres processus en attente. Est-ce vrai? Y a-t-il une signification pour Sleep(0) ?

26voto

Nick Meyer Points 14502

Selon la documentation MSDN pour Dormir:

Une valeur de zéro entraîne le thread abandonner le reste de son temps tranche que n'importe quel autre thread qui est prêt à fonctionner. Si il n'y a pas d'autres fils prêt à fonctionner, la fonction retourne immédiatement, et le fil continue l'exécution.

La chose importante à réaliser est que oui, cela donne d'autres threads une chance de s'exécuter, mais si aucun n'est prêt à courir, puis votre thread continue, laissant l'utilisation du PROCESSEUR à 100% étant quelque chose de toujours être en cours d'exécution. Si votre boucle while est juste filer en attendant que certaines condition, vous pourriez envisager d'utiliser une des primitives de synchronisation comme un événement de dormir jusqu'à ce que la condition est satisfaite ou dormir pendant un petit laps de temps pour éviter maxing sur le CPU.

16voto

Sjoerd Points 34671

Oui, cela donne la possibilité à d'autres threads de s'exécuter.

Une valeur de zéro oblige le thread à abandonner le reste de sa tranche de temps à tout autre thread prêt à s'exécuter. S'il n'y a aucun autre thread prêt à s'exécuter, la fonction retourne immédiatement et le thread continue son exécution.

La source

13voto

Steve Townsend Points 36948

Je crains que je ne peux pas l'améliorer sur la MSDN docs ici

Une valeur de zéro entraîne le thread abandonner le reste de son temps tranche que n'importe quel autre thread qui est prêt à fonctionner. Si il n'y a pas d'autres fils prêt à fonctionner, la fonction retourne immédiatement, et le fil continue l'exécution.

Windows XP/2000: UNE valeur de zéro causes le fil de renoncer à la reste de sa tranche de temps pour tout les autres threads de même priorité qui est prêt à fonctionner. Si il n'y a pas d'autres threads de même priorité prêt à exécuter, la fonction retourne immédiatement, et le fil continue l'exécution. Ce comportement a changé de départ avec Windows Server 2003.

Veuillez noter également (via upvote) les deux réponses utiles sur l'efficience des problèmes ici.

9voto

Alex Farber Points 19387

Soyez prudent avec Sleep (0), si le temps d'exécution d'une itération de boucle est court, cela peut ralentir considérablement cette boucle. Si cela est important pour l'utiliser, vous pouvez appeler Sleep (0), par exemple, une fois pour 100 itérations.

2voto

fduff Points 1149

Sleep(0); À l'instruction, le planificateur système va vérifier tous les autres threads exécutables et éventuellement leur donner une chance d'utiliser le système de ressources en fonction des priorités des threads.

Sur Linux il y a une commande spécifique pour cette: sched_yield() comme de l'homme pages:

sched_yield() provoque le thread appelant à renoncer à la CPU. L' fil est déplacé à la fin de la file d'attente pour sa priorité statique et un nouveau thread obtient pour.

Si le thread appelant est le seul fil dans le plus haut de la liste de priorité à ce moment, il continuera à fonctionner après un appel à l' sched_yield().

avec aussi

Stratégique des appels d' sched_yield() pouvez améliorer les performances en donnant d'autres threads ou processus une chance de s'exécuter lors de la (très) soutenu les ressources (p. ex., les mutex) ont été libérés par l'appelant. Éviter appelant sched_yield() inutilement ou de manière inappropriée (par exemple, lorsque les ressources nécessaires à d'autres préférence d'heure de threads sont encore détenus par les l'appelant), car cela provoque des changements de contexte, qui va dégrader les performances du système.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X