87 votes

Existe-t-il une implémentation en C++ d'une file d'attente ou d'un hachage sans verrou, prête à être produite ?

J'ai pas mal cherché sur Google une file d'attente sans verrou en C++. J'ai trouvé du code et quelques essais - mais rien que je puisse compiler. Un hash sans verrou serait également le bienvenu.

RÉSUMÉ : Jusqu'à présent, je n'ai pas de réponse positive. Il n'y a pas de bibliothèque "prête pour la production", et étonnamment aucune des bibliothèques existantes n'est conforme à l'API des conteneurs STL.

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 ?

41voto

Nova Points 806

Depuis la version 1.53, boost fournit un ensemble de structures de données sans verrou y compris les files d'attente, les piles et les files d'attente monoproducteur/monoconsommateur (c'est-à-dire les tampons en anneau).

0 votes

Boost::lockfree::queue ne fonctionne qu'avec les types POD et la plupart du temps n'est pas très utile. Je suis sûr que s'il y avait un moyen de fournir une structure plus flexible, boost l'aurait introduit.

1 votes

@rahman où est le problème ? Si vous voulez passer autre chose, en particulier des objets avec des effets secondaires opaques et éventuellement bloquants, vous n'avez pas compris l'objectif de la conception sans verrou.

0 votes

Pourquoi boost fournit une file d'attente et une pile sans verrou, toutes deux basées sur une liste chaînée. Mais il ne fournit pas de liste chaînée sans verrou ?

25voto

Steve Gilham Points 7829

Le point de départ serait l'un ou l'autre des articles de Herb Sutter sur la DDJ, que ce soit pour une un seul producteur et un seul consommateur ou multiples . Le code qu'il donne (en ligne à partir de la deuxième page de chaque article) utilise le type de modèle atomic<T> de style C++0x, que vous pouvez imiter en utilisant la bibliothèque interprocessus Boost.

Le code boost est enfoui dans les profondeurs de la bibliothèque interprocessus, mais après avoir lu le fichier d'en-tête approprié (atomic.hpp), les implémentations des opérations de comparaison et d'échange nécessaires sur les systèmes que je connais semblent saines.

1 votes

Steve, je suis également intéressé par les implémentations atomiques de Boost, mais elles semblent résider dans Interprocess' detail/ et ne sont pas documentées. Peut-on les utiliser en toute sécurité ? Merci de votre compréhension.

0 votes

Je connais très bien les articles de Herb Sutter - où avez-vous trouvé les sources ? Ils ne sont pas publiés par DDJ ni sur son site (ou peut-être suis-je aveugle ?).

1 votes

Le code est en ligne dans ces articles à partir de leurs deuxièmes pages respectives.

17voto

André Neves Points 526

Facebook's Folie semble avoir des structures de données sans verrou basées sur C++11 <atomic> :

J'ose dire qu'ils sont actuellement utilisés en production, et je suppose donc qu'ils peuvent être utilisés en toute sécurité dans d'autres projets.

Santé !

0 votes

Ils disposent également d'un File d'attente du MPMC. qui, selon eux, est "optionnellement bloquante". Il semble qu'il ne fasse pas partie de leur documentation habituelle, et je ne sais pas s'il est conseillé de l'utiliser.

17voto

Cameron Points 32208

Oui !

I a écrit une file d'attente sans verrou . Il présente des Features™ :

  • Entièrement sans attente (pas de boucle CAS)
  • Très rapide (plus de cent millions d'opérations de mise en file d'attente/de mise en file d'attente par seconde)
  • Utilise la sémantique de déplacement du C++11
  • Croît en fonction des besoins (mais seulement si vous le souhaitez)
  • Gestion de la mémoire sans verrou pour les éléments (à l'aide de blocs contigus pré-attribués).
  • Autonome (deux en-têtes plus une licence et un fichier readme)
  • Compile sous MSVC2010+, Intel ICC 13, et GCC 4.7.2 (et devrait fonctionner sous n'importe quel compilateur compatible avec C++11).

C'est disponible sur GitHub sous la licence BSD simplifiée (n'hésitez pas à la forker !).

Mises en garde :

  • Uniquement pour l'architecture mono-producteur mono-consommateur (c'est-à-dire deux fils)
  • Testé en profondeur sur x86(-64), et devrait fonctionner sur ARM, PowerPC, et d'autres CPU où les entiers alignés de taille native et les chargements et stockages de pointeurs sont naturellement atomiques, mais n'a pas été testé sur le terrain sur des CPU non-x86 (si quelqu'un en a un pour le tester, qu'il me le fasse savoir).
  • Je ne sais pas si des brevets ont été violés (utilisation à vos risques et périls, etc.). Notez que je l'ai conçu et mis en œuvre moi-même à partir de zéro.

11voto

Une telle bibliothèque existe, mais elle est en C.

Le passage au C++ devrait être simple.

liblfds

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X