Hier ist, zu verarbeiten, wie ein Schloss- schreiben freie Warteschlange in C++:
http://www.ddj.com/hpc-high-performance-computing/210604448
Aber wenn Sie sagen, „Thread A darf nicht blockieren“, sind Sie sicher, dass die Anforderung ist? Windows ist kein Echtzeitbetriebssystem (und bei normaler Verwendung auch kein Linux). Wenn Thread A in der Lage sein soll, den gesamten verfügbaren Systemspeicher zu verwenden, muss er Speicher reservieren (oder warten, während jemand anderes dies tut). Das Betriebssystem selbst kann keine Timing-Garantien bieten, die besser wären als die, die Sie hätten, wenn sowohl Leser als auch Schreiber eine In-Process-Sperre (d. H. Einen nicht geteilten Mutex) ergriffen hätten, um die Liste zu manipulieren. Und das Schlimmste, wenn man eine Nachricht hinzufügt, ist das OS, um Speicher zu bekommen.
Kurz gesagt, es gibt einen Grund, warum Warteschlangen, die Sie nicht mögen, eine feste Kapazität haben - es ist so, dass sie keinen Speicher in dem Thread mit der angeblich niedrigen Latenz zuweisen müssen.
So wird der Lock-Free-Code in der Regel weniger Block-y, aber aufgrund der Speicherzuweisung ist es nicht garantiert, und die Leistung mit einem Mutex sollte nicht so schäbig sein, wenn Sie eine wirklich große haben Stream von Ereignissen zu verarbeiten (wie Sie einen Netzwerktreiber schreiben und die Nachrichten sind eingehende Ethernet-Pakete).
Also, in Pseudo-Code, das erste, was ich würde versuchen würde:
Writer:
allocate message and fill it in
acquire lock
append node to intrusive list
signal condition variable
release lock
Reader:
for(;;)
acquire lock
for(;;)
if there's a node
remove it
break
else
wait on condition variable
endif
endfor
release lock
process message
free message
endfor
Nur wenn dies nicht akzeptabel Verzögerungen bei dem Writer-Thread würde ich sperren freie Codes gehe einzuführen beweist, (es sei denn, ich hatte zufällig schon eine passende Warteschlange.
Welche Threading-Bibliothek verwenden Sie? Pthreads? –
boost :: thread und einige Bits plattformspezifischen Codes hier und dort –
Ihr Ziel könnte dazu führen, dass nicht genügend Arbeitsspeicher zur Verfügung steht, da Sie nicht zulassen, dass der Writer-Thread Elemente blockiert oder löscht. Wenn Sie also eine kritische Größenbeschränkung der Warteschlange erreichen, müssen Sie entscheiden, ob Sie Elemente löschen oder den Writer-Thread blockieren möchten. Andernfalls fallen Sie Elemente indirekt, weil Ihr Programm fehlschlägt :-) – mmmmmmmm