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. –
- 1. quali sono le barriere di lettura e le barriere di scrittura nel blocco sincronizzato
- 2. Barriere di memoria e java.util.concurrent.locks.Esempio di configurazione
- 3. Quali sono esempi canonici di calcolo parallelo?
- 4. Quali sono alcuni esempi di interfacce Go?
- 5. Quali sono gli esempi reali di quando devono essere utilizzati gli elenchi collegati?
- 6. Barriere di memoria contro operazioni interbloccate
- 7. Quali sono tutti gli usi di '@' in C#?
- 8. Quali sono alcuni esempi di utilizzo di Datagrid di WPF?
- 9. Quali sono alcuni esempi di programmazione a livello di caratteri?
- 10. Quali sono alcuni esempi di utilizzo di Nokogiri?
- 11. Quali sono alcuni esempi impressionanti di codice funzionale?
- 12. Quali sono gli intrinsechi?
- 13. In Linux, quali tipi di file sono mappati in memoria?
- 14. Quali sono gli svantaggi di Stackless Python?
- 15. Barriere di memoria nello spazio utente? (Linux, x86-64)
- 16. Quali sono gli usi comuni di UDP?
- 17. Quali sono gli idiomi C++ utilizzati dai programmatori C++?
- 18. Quali sono gli scopi dei controlli utente in Visual C#?
- 19. Quali sono gli usi delle funzioni virtuali pure in C++?
- 20. Quali sono gli indici di slice predefiniti in Python * veramente *?
- 21. Quali sono gli errori di configurazione di Common Magento?
- 22. Quali sono gli endpoint OAuth2/OpenID Connect di Keycloak?
- 23. Quali sono le classi di memoria in D?
- 24. barriere di memoria e Linux kernel spinlock su TILE-Gx
- 25. Sono necessarie barriere di memoria quando si unisce a un thread?
- 26. Quali sono gli effetti collaterali dell'utilizzo di EmptyWorkingSet?
- 27. R: quali sono gli slot?
- 28. Esempi di Unione in C
- 29. Quali sono gli usi comuni delle variabili di condizione in C++?
- 30. Quali sono le garanzie di ordinazione della memoria C++ 11 in questo caso angolare?
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. –