Veo que el bloqueo de mutexes C++ 11 no es void lock() volatile
. ¿Cómo sabe el compilador qué funciones son barreras de memoria y cuáles no? ¿Son todas las funciones barreras incluso si no son volátiles? ¿Cuáles son algunas barreras de memoria menos conocidas y barreras de memoria que todos deberían saber?¿Qué son ejemplos de barreras de memoria en C++?
Respuesta
La biblioteca de tiempo de ejecución tiene que implementar un mutex de forma que el compilador lo sepa. El estándar de lenguaje no dice nada sobre cómo hacer esto.
Probablemente, se trata de una llamada a algún servicio del sistema operativo que funciona como una barrera de memoria. O el compilador puede tener una extensión, como void _ReadWriteBarrier();
La implementación real de su std::mutex
será tal que el compilador no realice el reordenamiento ilegal, no elide cargas variables, y se asegurará de que se acceda a la variable de bloqueo atómicamente y que la CPU realiza las barreras de memoria necesarias para la adquisición y liberación de la cerradura.
Los detalles de la cantidad de trabajo que se debe hacer para garantizar esto varían de una plataforma a otra, pero la implementación de su biblioteca hará lo correcto.
Mi pregunta es más sobre cómo sabe el compilador cuál es el mutex y por qué no reordena las variables antes y después del bloqueo. Las funciones ciertamente no están marcadas como volátiles. También una vez miré los encabezados de MSVC y parece que no es una plantilla y está enlazado a través de lib. Entonces ... no creo que esté en línea para que el compilador analice y vea si requiere que los vars en la función * this * no se reordenen ... –
@ acidzombie24: Presumiblemente, una llamada de función externa nunca será reordenada por el compilador, ya que al observar esto nunca se puede probar que sea correcto. –
- 1. Barreras de memoria frente a operaciones interbloqueadas
- 2. Barreras en OpenCL
- 3. ¿Se requieren barreras de memoria para unir un hilo?
- 4. Ejemplos de unión en C
- 5. C++ ¿Qué biblioteca de compresión en memoria?
- 6. ¿Qué son [] en C#?
- 7. ejemplos de cierres en node.js que causarían filtraciones de memoria
- 8. ¿Qué duros ejemplos muestran que los moldes de estilo C son malos?
- 9. ¿Qué son los métodos anónimos en C#?
- 10. ¿Barreras de memoria en el espacio de usuario? (Linux, x86-64)
- 11. ¿Cuáles son algunos ejemplos de interfaces Go?
- 12. ¿Qué son los errores semánticos en C-language y dar algunos ejemplos?
- 13. ¿Cómo entiendo las barreras de lectura de memoria y el volátil
- 14. ¿Cuáles son buenos ejemplos de uso de 'enlace' en clojure?
- 15. Ejemplos de Objective C buscados
- 16. Ejemplos de uso de genéricos en .Net (C#/VB.NET)
- 17. Ejemplos de "C++ moderno" en acción?
- 18. ¿Qué son iteradores, C++?
- 19. ¿Ejemplos convincentes de asignadores de C++ personalizados?
- 20. modernos C++ juego Ejemplos de programación
- 21. Ejemplos bien escritos de C++
- 22. Ejemplos de "Cosas" que no son Objetos en Ruby
- 23. Necesita ejemplos en C++ uso de vectores
- 24. Ejemplos de interfaces C para bibliotecas C++?
- 25. Expresiones regulares en C: ejemplos?
- 26. Ejemplos de REST sobre protocolos que no son HTTP
- 27. ¿Cuáles son algunos buenos ejemplos de Mixins y/o Rasgos?
- 28. C Administración de memoria
- 29. ¿Qué son declaraciones directas en C++? En
- 30. x509 C# ejemplos?
Realmente depende de la plataforma. Los compiladores de C++ para sistemas integrados con un solo núcleo pueden implementar mutex sin ningún tipo de barrera de memoria, porque la memoria siempre es coherente. –
@BenVoigt, todavía necesitan bloquear el reordenamiento de instrucciones del compilador. –