Ho un ringbuffer che assiste un consumatore e un produttore e utilizza due numeri interi per rilevare nuovi dati:Ordinamento di memoria meno restrittivo per il ringbuffer singolo produttore, singolo consumatore?
_lastReadIndex
_lastWrittenIndex
quindi non c'è dati non letti nel ringbuffer quando questi due valori non sono uguali.
Il Producer incrementi (e moduluses con la dimensione ringbuffer a avvolgenti) _lastWrittenIndex
quando un elemento viene aggiunto alla ringbuffer.
gira Il Consumatore, lettura entrambi i valori, la verifica per i nuovi dati e quando c'è, lo farà incremento (e modulo) _lastReadIndex
.
I tre termini evidenziati sottolineano i requisiti relativi al multithreading e alle barriere della memoria.
In che misura posso rilassare l'ordine di memoria per questo modello, tenendo conto del modello di memoria Intel? Credo che il modello di memoria di Intel consenta di riordinare i carichi con i negozi precedenti a indirizzi diversi?
EDIT utilizzando la libreria atomica C++ 11 std::memory_order_xxxx
ecc
Quindi vuoi atomici C++ 11, o decisioni dipendenti dall'architettura (usando l'assemblatore) per Intel? Nel primo caso l'architettura non è correlata, nel secondo - il tag 'C++' non è correlato. – Tsyvarev
Siamo spiacenti, librerie C++ 11 – user997112
Il fatto è che l'indicizzazione nel buffer circolare dipende dalla lettura del valore '_lastReadIndex' e ** quindi ** del modulo. Quindi sono due azioni separate. Se fosse solo per leggere il valore in '_lastReadIndex',' acquire' per read e 'release' per le scritture sarebbero sufficienti. – ViNi89