Gibt es eine blocklose Warteschlange für mehrere Lese- oder Schreib-Threads?

8

Ich dachte, ist es möglich, eine blocklose Warteschlange zu haben, wenn mehr als ein Thread liest oder schreibt? Ich habe eine Implementierung mit einer blocklosen Warteschlange gesehen, die mit einem Lese- und einem Schreib-Thread arbeitete, aber nie mehr als eins für beide. Ist es möglich? Ich glaube nicht. Kann / will es jemand beweisen?

    
Fabian Fagerholm 11.06.2010, 06:28
quelle

6 Antworten

13

Es gibt mehrere Algorithmen, die ich implementiert habe. Ein optimistischer Ansatz für blockierungsfreie FIFO-Warteschlangen , der das ABA-Problem durch Zeiger-Tagging vermeidet (benötigt die Anweisung CMPXCHG8B auf x86 ) und läuft in einer Produktions-App gut ( in Delphi geschrieben). ( Eine andere Version mit Java-Code )

Um wirklich, wirklich, ohne Sperre zu sein, benötigen Sie auch einen sperrfreien Speicherzuordner - siehe Skalierbare blockierungsfreie dynamische Speicherzuweisung (implementiert in Concurrent Building Block ) oder NBMalloc (aber bisher konnte ich keinen von diese).

Vielleicht möchten Sie auch Antworten auf optimistische blockierungsfreie FIFO-Warteschlangen impl?

    
Viktor Svub 11.06.2010, 11:40
quelle
2

Die Implementierung einer Lockless Queue durch Java ermöglicht sowohl Lese- als auch Schreibvorgänge. Diese Arbeit wird mit einer Vergleichs- und Setzoperation ausgeführt (was eine Einzel-CPU-Anweisung ist).

ConcurrentLinkedQueue verwendet eine Methode, bei der sich Threads beim Lesen (oder Abfragen) von Objekten aus der Warteschlange gegenseitig helfen. Da es verbunden ist, kann der Kopf der Warteschlange Schreibvorgänge akzeptieren, während das Ende der Warteschlange Lesevorgänge akzeptieren kann (vorausgesetzt, es ist ausreichend Platz vorhanden). All dies kann parallel durchgeführt werden und ist vollständig Thread-sicher.

    
John Vint 11.06.2010 16:59
quelle
1

Mit .NET 4.0 gibt es die ConcurrentQueue (T) -Klasse .
Laut C # 4.0 ist dies eine lockfreie Implementierung. Siehe auch diese Blogeintrag .

    
weismat 11.06.2010 06:47
quelle
0

Sie brauchen nicht unbedingt eine Sperre, sondern eine atomare Möglichkeit, Dinge aus der Warteschlange zu löschen. Dies ist auch ohne eine Sperre und mit einer atomaren test-and-set Anweisung möglich.

    
Sjoerd 11.06.2010 06:37
quelle
0

In der OmniThreadLibrary von Primoz Gabrijelcic (dem Delphi Geek) gibt es eine dynamische Warteschlange ohne Sperren: Ссылка

    
Marjan Venema 11.06.2010 14:41
quelle
0

Mit .NET 4.0 gibt es ConcurrentQueue-Klasse .

Beispiel

Ссылка

%Vor%     
Olivier Albertini 26.08.2016 23:00
quelle

Tags und Links