J'ai écrit ceci à un moment donné, probablement en 2010, je suis sûr que j'ai été aidé par différentes références. Il s'agit de Multi-Producer Single Consumer.
template <typename T>
class MPSCLockFreeQueue
{
private:
struct Node
{
Node( T val ) : value(val), next(NULL) { }
T value;
Node* next;
};
Node * Head;
__declspec(align(4)) Node * InsertionPoint; //__declspec(align(4)) forces 32bit alignment this must be changed for 64bit when appropriate.
public:
MPSCLockFreeQueue()
{
InsertionPoint = new Node( T() );
Head = InsertionPoint;
}
~MPSCLockFreeQueue()
{
// release the list
T result;
while( Consume(result) )
{
//The list should be cleaned up before the destructor is called as there is no way to know whether or not to delete the value.
//So we just do our best.
}
}
void Produce( const T& t )
{
Node * node = new Node(t);
Node * oldInsertionPoint = (Node *) InterLockedxChange((volatile void **)&InsertionPoint,node);
oldInsertionPoint->next = node;
}
bool Consume( T& result )
{
if (Head->next)
{
Node * oldHead = Head;
Head = Head->next;
delete oldHead;
result = Head->value;
return true;
}
return false; // else report empty
}
};
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 !