J'arrive peut-être un peu tard sur ce sujet.
L'absence de solutions (au moment où la question a été posée) est principalement due à un problème important en C++ (avant C++0x/11) : Le C++ n'a pas de modèle de mémoire concurrente.
Maintenant, en utilisant std::atomic, vous pouvez contrôler les problèmes d'ordre de la mémoire et avoir des opérations de comparaison et d'échange correctes. J'ai moi-même écrit une implémentation de la file d'attente sans verrou de Micheal&Scott (PODC96) en utilisant C++11 et les pointeurs aléatoires de Micheal (IEEE TPDS 2004) pour éviter les problèmes de libération précoce et d'ABA. Cela fonctionne bien mais c'est une implémentation rapide et sale et je ne suis pas satisfait des performances actuelles. Le code est disponible sur bitbucket : Expérience LockFree
Il est également possible d'implémenter une file d'attente sans verrou sans pointeurs de danger en utilisant le CAS à deux mots (mais les versions 64bit ne seront possibles que sur x86-64 en utilisant cmpxchg16b), j'ai un article de blog à ce sujet (avec un code non testé pour la file d'attente) ici : Mise en œuvre d'une comparaison générique à deux mots et d'un échange pour x86/x86-64 (Blog de la LSE.)
Mes propres benchmarks me montrent que la file d'attente doublement verrouillée (également dans l'article de Micheal&Scott de 1996) fonctionne aussi bien que la file d'attente sans verrou (je n'ai pas atteint un niveau de contention suffisant pour que les structures de données verrouillées aient des problèmes de performances, mais mes benchs sont trop légers pour l'instant) et la file d'attente concurrente du TBB d'Intel semble même meilleure (deux fois plus rapide) pour un nombre relativement faible (dépendant du système d'exploitation, sous FreeBSD 9, la limite la plus basse que j'ai trouvée jusqu'à présent, ce nombre est de 8 threads sur un i7 avec 4 ht-core, et donc 8 CPUs logiques) de threads et ont un comportement très étrange (le temps d'exécution de mon benchmark simple passe de quelques secondes à des heures ! )
Une autre limitation concernant les files d'attente sans verrou dans le style STL : le fait d'avoir des itérateurs sur une file d'attente sans verrou n'a pas de sens.
4 votes
Visual Studio 2010 contient une file d'attente sans verrou dans <concurrent_queue.h>.
1 votes
Et il y a un hash_map et un unordered_map à code.msdn.com/concrtextras
0 votes
J'ai lu la documentation sur concurrent_queue.h à l'adresse http://msdn.microsoft.com/en-us/library/ee355358.aspx. Elle ne dit rien sur les verrous. Où puis-je trouver de telles informations ?
0 votes
Concurrent_queue est sans verrou, consultez la documentation générale de l'exécution concurrentielle sur msdn.
2 votes
Il est à noter que, curieusement, le terme "lock-free" ne signifie pas nécessairement qu'il n'y a pas de verrous. Voir fr.wikipedia.org/wiki/Non-blocking_algorithm pour une définition.
0 votes
Boost 1.53 dispose de la bibliothèque Lockfree.
0 votes
Quelqu'un a-t-il mentionné libcds.sourceforge.net (assez récent je suppose) ? De plus, on remarque qu'il n'est pas logique qu'une file d'attente lockfree soit conforme à l'API STL parce que front() et pop() doivent être combinés pour être significatifs.
13 votes
Wow, une question demandant comment résoudre un problème commun mais difficile dans la programmation multithread qui a plusieurs solutions, a généré beaucoup de discussions, et a gagné une tonne d'upvotes... Et 9 ans plus tard, vous la fermez parce qu'elle est hors sujet. Merci pour votre contribution à StackOverflow, NathanOliver, Sir E_net4 the Wise Downvoter, Jean-François Fabre, Machavity, et gre_gor /s
0 votes
Est-ce que quelqu'un parmi les "fermiers" peut donner un indice sur ce qui devrait être considéré comme "hors sujet" ? De mon point de vue, ce problème n'est toujours pas résolu de manière généralisée, réutilisable et multiplateforme ? Comment allez-vous clore cette question ? Ou est-ce que stackoverflow est maintenant un forum réservé aux débutants ?
2 votes
Je dirais que les personnes qui ont fermé la question ne la comprennent probablement pas.
0 votes
"Nous n'autorisons pas les questions portant sur des recommandations de livres, d'outils, de bibliothèques de logiciels, etc. J'ai trouvé un certain nombre d'outils très utiles ici !