L'importance du Sommeil(0)
J'ai utilisé pour voir Sleep(0)
dans une partie de mon code où certains infini/long while
boucles sont disponibles. J'ai été informé qu'il ferait de la tranche de temps disponible pour d'autres processus en attente. Est-ce vrai? Est-il de l'importance pour Sleep(0)
?
- Avec C++11, vous avez une meilleure plate-forme indépendante de façon à faire:
std::this_thread::yield()
!
Vous devez vous connecter pour publier un commentaire.
Selon la documentation MSDN pour Le sommeil:
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% depuis quelque chose sera toujours 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.
Oui, il donne d'autres threads la chance de s'exécuter.
Source
Je crains que je ne peux pas l'améliorer le MSDN docs ici
Veuillez noter également (via upvote) les deux réponses utiles sur l'efficience des problèmes ici.
Être prudent avec Sleep(0), si une boucle d'itération temps d'exécution est court, cela peut ralentir un tel boucle de manière significative. Si c'est important de l'utiliser, vous pouvez appeler le Sommeil(0), par exemple, une fois par 100 itérations.
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:
avec aussi
SwitchToThread()
ainsiEn une seule application....le thread principal cherché des choses à faire, puis a lancé le "travail" par l'intermédiaire d'un nouveau thread. Dans ce cas, vous devez appeler sched_yield() (ou sleep(0)) dans le thread principal, de sorte que vous ne faites pas de la "recherche" pour le travail, plus important que le "travail". Je préfère dormir(0), mais parfois c'est excessif (parce que vous dormez une fraction de seconde).
Sleep(0) est un outil puissant et il peut améliorer les performances dans certains cas. De l'utiliser dans une boucle rapide pourrait être envisagée dans des cas particuliers. Lorsqu'un ensemble de threads doit être extrêmement sensible, ils doivent tous utiliser le Sommeil(0) fréquemment. Mais il est crutial pour trouver une règle pour ce réactif dans le contexte du code.
Je vous ai donné quelques détails dans https://stackoverflow.com/a/11456112/1504523
Je suis en utilisant l'aide de pthreads et pour quelque raison que sur mon mac le compilateur n'est pas de trouver pthread_yield() pour être déclaré. Mais il semble que le sommeil(0) est la même chose.