2012-07-29 13 views
10

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

+5

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

+1

@BenVoigt, todavía necesitan bloquear el reordenamiento de instrucciones del compilador. –

Respuesta

5

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

5

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.

+1

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

+0

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

Cuestiones relacionadas