Frage

Ich suche nach Dokumentation, wie man eine MP/MC-Warteschlange so schreibt, dass sie sperrenfrei oder sogar wartefrei ist.Ich verwende .Net 4.0.Ich habe viel C++-Code gefunden, bin aber mit Speichermodellen nicht sehr vertraut, daher ist die Wahrscheinlichkeit groß, dass ich bei der Portierung nach C# einige Fehler einführe.

War es hilfreich?

Lösung

Warum brauchen Sie Ihrer Meinung nach eine sperrenfreie Warteschlange?Haben Sie es versucht? ConcurrentQueue<T>, möglicherweise eingeschlossen in a BlockingCollection<T>?

Das Schreiben von Multithread-Code ist schwierig.Das Schreiben von sperrenfreiem Code ist sogar noch schwieriger und Sie sollten es nicht selbst tun, es sei denn, Sie müssen es wirklich.

Andere Tipps

Als Option, um zu berücksichtigen, gibt es einen Algorithmus von Der begrenzte Multiple Producer Multiple Consumer Warteschlange von Dmitry Vyukov .Ich habe den Algorithmus auf .NET portiert, Sie können die Quellen auf Github finden.Es ist sehr schnell.

Der Enqueue-Algorithmus:

generasacodicetagpre.

der Dequeue-Algorithmus:

generasacodicetagpre.

Mein erster Versuch wäre mit ConcurrentQueue<T> Sie können Ihren Datenspeicher jedoch hinter einer Schnittstelle abstrahieren, sodass Sie Implementierungen problemlos ändern können.Vergleichen Sie dann typische Szenarien und sehen Sie, wo Probleme auftreten.Erinnern:Vorzeitige Optimierung ist die Wurzel allen Übels.Gestalten Sie Ihr System so, dass es nicht an eine Implementierung, sondern an einen Vertrag gebunden ist. Anschließend können Sie Ihre Implementierungen nach Ihren Wünschen optimieren.

Ich habe es mir angeschaut ConcurrentQueue<T> mit ILSpy und scheint auf den ersten Blick eine sperrenfreie Implementierung zu sein – die Chancen stehen also gut, dass es genau das ist, was Sie suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top