Ich habe einen Ringspeicher, die ein Verbraucher und ein Hersteller-Services und nutzt zwei ganzen Zahlen, neue Daten zu erfassen:Least-restriktive Speicherordnung für Single-Producer, Single-Consumer-Ringpuffer?
_lastReadIndex
_lastWrittenIndex
so gibt es ungelesene Daten in den Ringpuffer, wenn diese beiden Werte nicht gleich sind.
Der Producer Inkrementen (Moduli und mit dem Ringpuffer Größe Wrap-around) _lastWrittenIndex
, wenn ein Element mit dem Ringpuffer hinzugefügt wird.
Der Verbraucher dreht, Lese beiden Werte, für neue Daten überprüft und wenn es, es wird Zuwachs (und Modul) _lastReadIndex
.
Die drei hervorgehobenen Begriffe unterstreichen die Anforderungen in Bezug auf Multithreading und Speicherbarrieren.
Wie weit kann ich die Speicherbestellung für dieses Design unter Berücksichtigung von Intels Speichermodell entspannen? Ich glaube, dass das Speichermodell von Intel ermöglicht, dass Ladungen mit früheren Speichern an verschiedene Adressen neu geordnet werden können.
EDIT die C++ 11 Atom Bibliothek std::memory_order_xxxx
etc
Also wollen Sie C++ 11 Atomics oder architekturabhängige Entscheidung (mit Assembler) für Intel? Im ersten Fall ist die Architektur nicht verwandt, in der zweiten - "C++" - Tag ist nicht verwandt. – Tsyvarev
Sorry, C++ 11 Bibliotheken – user997112
Die Sache ist, dass Ihre Indizierung im Ring-Puffer, hängt davon ab, den _lastReadIndex-Wert und ** dann ** das Modulo zu lesen. Es sind also zwei getrennte Aktionen. Wenn nur der Wert in _lastReadIndex gelesen werden würde, würden "acquire" zum Lesen und "release" für die Schreibvorgänge ausreichen. – ViNi89