Comment puis-je créer une file d'attente sans verrouillage?
J'ai passé aujourd'hui à la recherche dans lockless files d'attente. J'ai plusieurs producteurs, plusieurs consommateurs de la situation. J'ai mis en place, pour les essais, un système à l'aide du Contrefil SList chose sous Win32 et il a doublé la performance de mon lourdement filetée de la tâche en fonction du code. Malheureusement, si, je vous souhaite de prendre en charge plusieurs plates-formes. Verrouillage sur de multiples plates-formes en soi n'est pas un problème et je peux supposer que je peux verrouillage sans problèmes. Toutefois, la mise en œuvre effective perd moi.
Le gros problème semble être que vous avez besoin pour garantir une liste push/pop utilisera un seul Contrefil appel. Sinon, vous laissant de l'espace pour un autre thread pour étouffer dans et vis les choses. Je suis pas certain de savoir comment la mise en œuvre de microsoft fonctionne sous le capot et aimerais en savoir plus.
Quelqu'un peut-il me diriger vers de l'information utile (Plate-forme et du langage sont assez hors de propos)?
Ajouté à qui j'aimerais savoir si ses possible de mettre en œuvre un lockless vecteur. Qui aurait d'énormes quantités d'utilisation pour moi 🙂
Cheers!
Edit: après Avoir lu la plante DDJ l'article, je peux voir une réduction de la serrure de la file d'attente qui est assez similaire à celui que j'avais déjà. Cependant je remarque qu'il y a des papiers à la fin qui peut faire le vrai lockless file d'attente avec l'aide d'un double compare-and-swap (DCAS). Quelqu'un a mis en place une file d'attente à l'aide de cmpxchg8b (ou cmpxchg16b d'ailleurs)?
Je suis juste en rêvant à ce point (n'ayant pas lu les journaux), mais vous pouvez utiliser ce système pour mettre à jour la tête et la queue pointeur simultanément et ainsi d'éviter des problèmes avec un autre thread de saut entre les 2 opérations atomiques. Cependant, vous avez encore besoin de prendre la tête du pointeur pour tester que par rapport à l'indicateur de queue pour voir si yo ont juste modifié la queue. Comment éviter de faire un autre thread modification de cette information, tandis que l'autre thread se prépare à le faire lui-même? Comment cela est-il mis en œuvre dans un lockless? Ou suis-je mieux de lire le undecipherability qui est un document de recherche? 😉
source d'informationauteur Goz
Vous devez vous connecter pour publier un commentaire.
Vous pourriez probablement mettre en œuvre limitée de la taille de la file d'attente avec moins de difficulté... je pensais à elle ces derniers temps et est venu avec cette conception, mais vous pouvez probablement trouver beaucoup d'autres idées intéressantes: (attention: il pourrait avoir quelques problèmes!)
head
==tail
il n'y a pas d'élémentsenqueue(ptr)
Verrouillé-Swaptail
avec la valeur NULL (prev_tail
est le échangé valeur)prev_tail == NULL
essayez à nouveauprev_tail + 1
(enveloppant) ==head
votre file d'attente est pleineptr
dans*prev_tail
et attribuerprev_tail+1
àtail
(attention à la mémoire tampon de wrap-around)dequeue()
faire une copie tmp_head=la tête et vérifiertmp_head == tail
*tmp_head
commeptr
head
avectmp_head
swaphead
avechead+1
ptr
Vous pouvez vous attendre à la fois la tête et la queue TAS d'opérations, mais si la file d'attente n'est pas soutenu, vous devriez réussir la première fois, inutile sans verrous.
Illimité-la taille des files d'attente sont "un peu" plus difficile 😉 Mais vous devriez être capable de créer un grand-assez de file d'attente pour la plupart des besoins.
Je pense qu'il y a une certaine discussion intéressante sur ce sujet icien particulier ce fil.
Vous voudrez peut-être jeter un oeil à Herbe Sutters mise en œuvre d'un bas de verrouillage de la file d'attente.
http://www.drdobbs.com/hpc-high-performance-computing/211601363
Il utilise le c++0x atomics, mais il serait (devraient) être facile à mettre en œuvre des architectures atomique ops (__synchronisation_* à l'aide de GNU, atomic_* sur solaris, etc).
Ces les gars ont, peut-être que vous pourriez trouver un peu d'inspiration. Les autres dossiers intéressants sont yqueue.hpp et atomic_ptr.php
viraptor solution de verrouillage , il n'y a pas de multiples producteur/plusieurs consommateurs lockless file d'attente algotihms im courant de .