Je cherche une approche qui me permettra d'assigner des nombres ordinaux 0 .. (N-1) à N O/S threads, de sorte que les threads sont dans un ordre numérique. C'est-à-dire que le thread qui obtient aura un ID de thread O/S inférieur au thread avec un ordinal 1.algorithme de commande de fil rapide sans atomique CAS
Pour ce faire, les threads communiquent via un espace mémoire partagé. Le modèle d'ordre de mémoire est tel que les écritures seront atomiques (si deux threads simultanés écrivent un emplacement mémoire en même temps, le résultat sera l'un ou l'autre). La plate-forme ne prendra pas en charge les opérations de comparaison et de définition atomiques. Je recherche un algorithme qui soit efficace en termes de nombre d'écritures dans la mémoire partagée, et qui se termine rapidement avec des dizaines de milliers de threads, sans aucune mauvaise situation d'arrivée de thread.
Le système d'exploitation attribuera des numéros de thread dans un ordre arbitraire dans un espace de 32 bits. Il peut y avoir des retards de création de threads arbitraires - l'algorithme peut être considéré comme terminé lorsque tous les N threads sont présents. Je suis incapable d'utiliser la solution évidente de rassembler tous les threads, puis de les trier - sans opération atomique, je n'ai aucun moyen de collecter en toute sécurité tous les threads individuels (un autre thread pourrait réécrire le slot) .
Où puis-je trouver une implémentation d'AtomicIncrement qui ne repose pas sur des primitives atomiques? Atomic Compare-and-Set semble nécessaire pour implémenter AtomicIncrement. – caffiend
Certaines plates-formes ont un opérateur intrinsèque AtomicIncrement, sinon, vous devez le construire avec CAS et vous êtes bourré. – Martin
Parce que cela ne s'exécute qu'une seule fois pour chaque thread, vous pouvez simplement utiliser un spinlock. Dans la plupart des cas, il ne tournera pas du tout, dans certains cas cela prendra un peu plus de temps mais même pas très longtemps à moins que vous ne créiez des centaines de threads par seconde. – Martin