C'est proche d'un spinlock mais le sched_yield() permet à tous les autres threads de la machine d'être ordonnancés avant que ce thread ne le soit à nouveau (si le scheduler utilisé est CFS, qui ordonnance il me semble les threads en round-robin, sauf ceux en temps-réel).
NON !
Je l'ai appris à mes dépends. Ceci était vrai avant le CFS. Depuis le CFS, sched_yield() ne fait plus du tout ce que tu attends en mode mono-processeur ; par contre, il est plus efficace pour synchroniser des threads quand tu as plusieurs processeurs. Pendant quelques temps, il y a eu un sysctl pour garder l'ancien comportement (noyau 2.6.23) : /proc/sys/kernel/sched_compat_yield notamment parce que la JVM en dépendait. Voir http://kerneltrap.org/Linux/CFS_and_sched_yield
Ce sysctl a été retiré plus tard (noyau 2.6.38). Maintenant, il ne faut absolument pas compter dessus. Il faut utiliser les futex pour faire des spinlocks (mais ça ne marche qu'en multi-processeur par principe), ou un ordonnancement temps-réel et demander le scheduler SCHED_RR grâce à sched_setscheduler(2) (mais on retrouve les contraintes du temps-réel).
[^] # Re: Ai-je bien compris ?
Posté par MrLapinot (site web personnel) . En réponse au journal Performances des processeurs Intel et optimisation. Évalué à 4.
NON !
Je l'ai appris à mes dépends. Ceci était vrai avant le CFS. Depuis le CFS, sched_yield() ne fait plus du tout ce que tu attends en mode mono-processeur ; par contre, il est plus efficace pour synchroniser des threads quand tu as plusieurs processeurs. Pendant quelques temps, il y a eu un sysctl pour garder l'ancien comportement (noyau 2.6.23) : /proc/sys/kernel/sched_compat_yield notamment parce que la JVM en dépendait. Voir http://kerneltrap.org/Linux/CFS_and_sched_yield
Ce sysctl a été retiré plus tard (noyau 2.6.38). Maintenant, il ne faut absolument pas compter dessus. Il faut utiliser les futex pour faire des spinlocks (mais ça ne marche qu'en multi-processeur par principe), ou un ordonnancement temps-réel et demander le scheduler SCHED_RR grâce à sched_setscheduler(2) (mais on retrouve les contraintes du temps-réel).