Sperrfreie Warteschlangen können für den Einzelfall Produzent / Einzelverbraucher implementiert werden, und häufig können Sie Ihre Software so entwickeln, dass die Anzahl der Warteschlangen für mehrere Produzenten oder für mehrere Verbraucher minimiert wird.
Eine Warteschlange ohne Sperre kann folgendermaßen aufgebaut werden: Ordnen Sie ein Array der zu übermittelnden Elemente sowie zwei Ganzzahlen zu, und nennen Sie sie Head und Tail. Head ist ein Index im Array, in dem das nächste Element hinzugefügt wird. "Tail" ist ein Index im Array, in dem das nächste Element zum Entfernen verfügbar ist. Die Producer-Task liest H und T, um festzustellen, ob Platz zum Hinzufügen eines Elements vorhanden ist. Schreibt das Element in den H-Index und aktualisiert dann H. Die Consumer-Tasks lesen H und T, um festzustellen, ob Daten verfügbar sind, lesen Daten aus dem Index T und aktualisieren dann T. Grundsätzlich handelt es sich um einen Ringpuffer, auf den von zwei Tasks zugegriffen wird Die Reihenfolge der Operationen (Einfügen, dann Aktualisieren von H; Entfernen, dann Aktualisieren von T) stellt sicher, dass keine Datenbeschädigung auftritt.
Wenn Sie eine Situation mit mehreren Produzenten und einem einzelnen Konsumenten oder einem einzelnen Produzenten und mehreren Konsumenten haben, haben Sie effektiv irgendeine Ressourcenbeschränkung, und es gibt nichts anderes, als die Synchronisation zu verwenden, da es wahrscheinlicher ist, dass der Leistungsbegrenzer dies tut sei der einzige Produzent / Konsument als ein OS-Overhead mit dem Sperrmechanismus.
Wenn Sie jedoch mehrere Produzenten UND Konsumenten haben, lohnt es sich, Zeit (im Design-Bereich) zu investieren, um zu prüfen, ob Sie keinen besser koordinierten Kommunikationsmechanismus erhalten können. In einem solchen Fall macht die Serialisierung aller Daten über eine einzelne Warteschlange die Effizienz der Warteschlange definitiv zur zentralen Determinante der Leistung.