2012-07-29 24 views
10

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++?

+5

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. –

+1

@BenVoigt, hanno ancora bisogno di bloccare il riordino delle istruzioni del compilatore. –

risposta

5

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();

5

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.

+1

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 ... –

+0

@ 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. –

Problemi correlati