Vedo che il blocco di mutex C++ 11 non è void lock() volatile
. Come fa il compilatore a sapere quali sono le barriere della memoria e quali no? Tutte le barriere funzionali sono anche se non sono volatili? Quali sono le barriere di memoria meno conosciute e le barriere della memoria che tutti dovrebbero sapere?Quali sono gli esempi di barriere di memoria in C++?
risposta
La libreria di runtime deve implementare un mutex in modo che il compilatore sappia! Lo standard di lingua non dice nulla su come farlo.
Probabilmente, si tratta di una chiamata a qualche servizio del sistema operativo che funge da barriera di memoria. Oppure il compilatore può avere un'estensione, come void _ReadWriteBarrier();
L'implementazione effettiva del tuo std::mutex
sarà tale che il compilatore non esegue il riordino illegale, non elide i carichi variabili e farà in modo che la variabile di blocco sia accessibile atomicamente e che la CPU esegue le necessarie barriere di memoria per l'acquisizione e il rilascio del blocco.
I dettagli di quanto lavoro deve essere fatto per garantire che questo varia da piattaforma a piattaforma, ma l'implementazione della libreria farà la cosa giusta.
La mia domanda è più di come il compilatore sa cosa è in mutex e perché non riordina le variabili prima e dopo il blocco? Le funzioni non sono certamente contrassegnate come volatili. Inoltre ho guardato le intestazioni MSVC e sembra che non sia un modello ed è collegato tramite lib. Quindi ... non credo che sia in linea con il compilatore per analizzare e vedere se richiede vars in * questa * funzione da non riordinare ... –
@ acidzombie24: Presumibilmente, una chiamata di funzione esterna non verrà mai riordinata dal compilatore, dal momento che si osserva questo non può mai essere dimostrato di essere corretto. –
Dipende veramente dalla piattaforma. I compilatori C++ per sistemi embedded con un solo core possono essere in grado di implementare mutex senza alcun tipo di barriera di memoria, perché la memoria è sempre coerente. –
@BenVoigt, hanno ancora bisogno di bloccare il riordino delle istruzioni del compilatore. –