Ich habe heute in lockless Warteschlangen verbracht. Ich habe eine multiple Produzenten-, Mehrfachverbrauchersituation. Ich habe zum Testen ein System implementiert, das die Interlocked SList-Funktion unter Win32 verwendet, und es hat die Leistung meines Task-basierten Codes mit hohem Threading verdoppelt. Leider möchte ich jedoch mehrere Plattformen unterstützen. Das Interlocking auf mehreren Plattformen ist kein Problem und ich kann davon ausgehen, dass ich ohne Probleme eingreifen kann. Die tatsächliche Implementierung verliert mich jedoch.Wie erstelle ich eine blocklose Warteschlange?
Das große Problem scheint zu sein, dass Sie eine Liste garantieren müssen, Push/Pop wird nur einen Interlocked Anruf verwenden. Sonst lässt du Platz für einen anderen Thread, der einknickt und Dinge vermasselt. Ich bin mir nicht sicher, wie die Microsoft-Implementierung unter der Haube funktioniert und würde gerne mehr wissen.
Kann mir jemand auf nützliche Informationen hinweisen (Plattform und Sprache sind ziemlich irrelevant)?
Hinzu kommt, würde ich gerne wissen, ob es möglich ist, einen Lockless-Vektor zu implementieren. Das hätte enorme Mengen an Nutzen für mich :) Prost!
Edit: Nachdem ich DDJ-Artikel von Kraut gelesen habe, kann ich eine Warteschlange mit reduzierter Sperre sehen, die ziemlich ähnlich der ist, die ich bereits hatte. Wie auch immer, ich merke, dass es am Ende Papiere gibt, die mit einer Double-Compare-and-Swap-Operation (DCAS) die echte Lockless-Queue machen können. Hat jemand eine Warteschlange mit cmpxchg8b (oder cmpxchg16b für diese Angelegenheit) implementiert?
Ich denke nur an diesem Punkt (ohne die Papiere zu lesen), aber Sie könnten dieses System verwenden, um den Kopf- und den Endzeiger gleichzeitig zu aktualisieren und damit Probleme mit einem anderen Thread zwischen den 2 atomaren Operationen zu vermeiden. Allerdings müssen Sie immer noch den nächsten Kopfzeiger bekommen, um dies gegen den Schwanzzeiger zu testen, um zu sehen, ob Sie gerade den Schwanz modifiziert haben. Wie vermeidet man, dass ein anderer Thread diese Informationen ändert, während sich der andere Thread selbst darauf vorbereitet? Wie genau wird das in einer Lockless-Methode umgesetzt? Oder bin ich besser dran, die Unentschlüsselbarkeit zu lesen, die eine Forschungsarbeit ist? ;)
siehe http://stackoverflow.com/questions/1164023/is-there-a-production-ready-lock-free-queue-or-hash-implementation-in-c – Mark
Schande, Sie haben nicht geantwortet:) Ich hatte diese Warteschlange nicht gefunden, und außerdem hatte ich Herb Sutters Multiproductor/Consumer DDJ Artikel nicht gefunden :) Danke! – Goz