Supongamos que tengo mis propias funciones no en línea LockMutex y UnlockMutex, que están usando mutex adecuado, como boost, en el interior. ¿Cómo sabrá el compilador que no debe reordenar otras operaciones con respecto a las llamadas a LockMutex y UnlockMutex? No puede saber cómo implementaré estas funciones en alguna otra unidad de compilación.Reordenación del compilador alrededor de los límites de mutex?
void SomeClass::store(int i)
{
LockMutex(_m);
_field = i; // could the compiler move this around?
UnlockMutex(_m);
}
ps: Se supone que uno debe usar instancias de clases para mantener bloqueos para garantizar el desbloqueo. Lo dejé para simplificar el ejemplo.
Correcto. Un compilador de movimiento de código tendrá un modelo de análisis estático de cómo funciona su programa y sus dependencias operacionales/de datos, y preservará esas dependencias. –
Estrictamente hablando, no hay ninguna dependencia entre la variable _field, por ejemplo, y la llamada a LockMutex o UnlockMutex, por lo que preservar las dependencias no ayuda aquí. –