Le comportement de sched_yield

J'ai quelques questions au sujet de la sched_yield fonction parce que je suis de voir qu'il ne fonctionne pas comme prévu dans mon code. De nombreuses fois, je vois que le même thread s'exécute de nouveau et de nouveau, même en présence d'autres threads, lorsque j'essaie de rendement en appelant sched_yield.

Aussi Si j'ai multicores, sera sched_yield de rendement pour les threads en cours d'exécution sur tous les cœurs, ou un seul noyau. Disons, par exemple, j'ai des Fils 1, 2 et 3 en cours d'exécution sur le core 1 et Fils 4, 5 et 6 sur le noyau 2 et Si sched_yield est appelé par le Thread 2, il sera remplacé par le Thread 1 et 3, ou 1, 3, 4, 5 et 6, tout est possible? Je demande cela parce que, dans .Net Thread.Yield seulement les rendements de threads en cours d'exécution sur le même core/processeur.

Comment voulez-vous qu'il fonctionne? TBH, je ne comprends vraiment pas pourquoi cet appel est utile, que ce soit sur POSIX/***X, Windows ou de tout multitâche préemptif. Si vous le rendement de votre fil, vous n'avez aucune garantie que le système d'exploitation ne sera pas seulement de le charger à nouveau immédiatement, même sur la base même si les autres threads ne sont pas prêt à l'époque. Si l' .NET version a une affinité du processeur, (et oui, je l'ai googlé et il semble qu'il a), qui est encore plus étrange - je suppose qu'il peut améliorer les performances avec des fibres?
il est utile de les appeler quand vous avez plus de processus exécutables/threads que de cœurs et que vous souhaitez donner aux autres threads/processus une chance de faire des progrès (par exemple, un thread a juste donné un autre thread quelque chose à faire et le coût de la première thread d'aller dormir pour attendre à la fin est plus que le coût de l' (le deuxième fil de faire "quelque chose" + le premier thread vérifier que c'est fait).

OriginalL'auteur MetallicPriest | 2011-06-15