web-dev-qa-db-fra.com

Signification du sommeil (0)

J'avais l'habitude de voir Sleep(0) dans une partie de mon code où des boucles infinies/longues while 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)?

46
bdhar

Selon la documentation de MSDN pour Sleep :

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 chose importante à réaliser est que oui, cela donne aux autres threads une chance de s'exécuter, mais s'il n'y en a aucun prêt à fonctionner, votre thread continue - laissant l'utilisation du processeur à 100% depuis quelque chose sera toujours en cours d'exécution. Si votre boucle while tourne juste en attendant une condition, vous voudrez peut-être envisager d'utiliser une primitive de synchronisation comme un événement pour dormir jusqu'à ce que la condition soit satisfaite ou dormir pendant un petit laps de temps pour éviter de maximiser le processeur.

47
Nick Meyer

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 à être exécuté. 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.

Source

17
Sjoerd

J'ai peur de ne pas pouvoir améliorer les documentation MSDN ici

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.

Windows XP/2000: une valeur de zéro oblige le thread à abandonner le reste de sa tranche de temps à tout autre thread de priorité égale qui est prêt à s'exécuter. S'il n'y a aucun autre thread de priorité égale prêt à s'exécuter, la fonction retourne immédiatement et le thread continue son exécution. Ce comportement a changé à partir de Windows Server 2003.

Veuillez également noter (via upvote) les deux réponses utiles concernant les problèmes d'efficacité ici.

14
Steve Townsend

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.

14
Alex F

Sleep(0); À cette instruction, le planificateur système vérifiera tout autre thread exécutable et leur donnera éventuellement une chance d'utiliser les ressources système en fonction des priorités du thread.

Sous Linux, il existe une commande spécifique pour cela: sched_yield() à partir des pages de manuel:

sched_yield() fait que le thread appelant abandonne le CPU. Le thread est déplacé à la fin de la file d'attente pour sa priorité statique et un nouveau thread s'exécute.

Si le thread appelant est le seul thread de la liste de priorité la plus élevée à ce moment-là, il continuera à s'exécuter après un appel à sched_yield().

avec aussi

Les appels stratégiques à sched_yield() peuvent améliorer les performances en donnant à d'autres threads ou processus une chance de s'exécuter lorsque des ressources (fortement) contestées (par exemple, des mutex) ont été libérées par l'appelant. Évitez d'appeler sched_yield() inutilement ou de manière inappropriée (par exemple, lorsque les ressources nécessaires à d'autres threads programmables sont toujours détenues par l'appelant), car cela entraînerait des changements de contexte inutiles, ce qui dégraderait les performances du système.

3
fduff

Dans une application .... le thread principal a cherché des choses à faire, puis a lancé le "travail" via un nouveau thread. Dans ce cas, vous devez appeler sched_yield () (ou sleep (0)) dans le thread principal, afin de ne pas rendre la "recherche" de travail plus importante que le "travail". Je préfère dormir (0), mais parfois c'est excessif (car vous dormez une fraction de seconde).

2
norm

Sleep (0) est un outil puissant et il peut améliorer les performances dans certains cas. Son utilisation dans une boucle rapide peut être envisagée dans des cas particuliers. Lorsqu'un ensemble de threads doit être extrêmement réactif, ils doivent tous utiliser fréquemment Sleep (0). Mais il est essentiel de trouver une règle pour ce que signifie réactif dans le contexte du code.

J'ai donné quelques détails dans https://stackoverflow.com/a/11456112/150452

1
Arno

J'utilise pthreads et pour une raison quelconque sur mon mac, le compilateur ne trouve pas pthread_yield () à déclarer. Mais il semble que dormir (0) soit la même chose.

0
Nick Sotiros