Importance du sumil (0)

J’avais l’habitude de voir Sleep(0) dans certaines parties de mon code où certaines boucles infinies / longues étaient 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 le Sleep(0) ?

Selon la documentation de MSDN pour Sleep :

Une valeur égale à zéro entraîne le thread à abandonner le rest de sa tranche de temps à tout autre thread prêt à être exécuté. Si aucun autre thread n’est prêt à être exécuté, la fonction retourne immédiatement et le thread continue son exécution.

La chose importante à réaliser est que oui, cela donne la chance aux autres threads de s’exécuter, mais s’il n’y en a pas de prêt à fonctionner, alors votre thread continue – laissant l’utilisation du processeur à 100% puisque quelque chose fonctionnera toujours. Si votre boucle while tourne simplement en attendant une condition, vous pouvez envisager d’utiliser une primitive de synchronisation comme un événement pour suspendre jusqu’à ce que la condition soit satisfaite ou pour suspendre un peu de temps pour éviter de maximiser le processeur.

Oui, cela donne la chance à d’autres threads de s’exécuter.

Une valeur égale à zéro entraîne le thread à abandonner le rest de sa tranche de temps à tout autre thread prêt à être exécuté. Si aucun autre thread n’est prêt à être exécuté, la fonction retourne immédiatement et le thread continue son exécution.

La source

J’ai peur de ne pas pouvoir améliorer les documents MSDN ici

Une valeur égale à zéro entraîne le thread à abandonner le rest de sa tranche de temps à tout autre thread prêt à être exécuté. Si aucun autre thread n’est prêt à être exécuté, la fonction retourne immédiatement et le thread continue son exécution.

Windows XP / 2000: une valeur égale à zéro entraîne le thread à abandonner le rest de sa tranche de temps à tout autre thread de priorité égale prêt à être exécuté. Si aucun autre thread de priorité égale n’est prêt à être exécuté, 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.

Faites attention avec Sleep (0), si le temps d’exécution d’une itération de boucle est court, cela peut ralentir cette boucle de manière significative. Si cela est important, vous pouvez appeler Sleep (0), par exemple une fois par 100 itérations.

Sleep(0); Lors de cette instruction, le planificateur du système vérifiera s’il existe d’autres threads exécutables et leur donnera éventuellement la possibilité d’utiliser les ressources du 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() entraîne le thread appelant à abandonner le processeur. Le thread est déplacé à la fin de la queue pour sa priorité statique et un nouveau thread doit s’exécuter.

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 aux autres threads ou processus la possibilité 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() inutile ou inappropriée (par exemple, lorsque l’appelant a encore des ressources nécessaires pour d’autres threads programmables), car cela entraînerait des changements de contexte inutiles, ce qui nuirait aux performances du système.

Le sumil (0) est un outil puissant qui 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 fils doit être extrêmement réactif, ils doivent tous utiliser fréquemment Sleep (0). Mais il est primordial de trouver une règle pour savoir quels moyens réactifs dans le contexte du code.

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

Dans une application … le thread principal cherchait des choses à faire, puis a lancé le “travail” via un nouveau sujet. Dans ce cas, vous devriez appeler sched_yield () (ou sleep (0)) dans le thread principal, de sorte que vous ne fassiez pas le “recherche” de 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).

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