Supongamos que hay dos hilos ejecutándose en x86 CPU0 y CPU1 respectivamente. Hilo que se ejecuta en la CPU0 ejecuta los siguientes comandos:¿Están dos tiendas de CPU consecutivas en x86 en el caché manteniendo el orden?
A=1
B=1
línea de caché que contiene un principio propiedad de CPU1 y que contiene B propiedad de CPU0.
Tengo dos preguntas:
Si he entendido bien, ambas tiendas se pondrán en memoria intermedia de almacenamiento de la CPU. Sin embargo, para la primera tienda
A=1
, la memoria caché de la CPU1 debe invalidarse, mientras que la segunda tiendaB=1
puede enjuagarse inmediatamente ya que la CPU0 posee la línea de caché que la contiene. Sé que la CPU x86 respeta las órdenes de la tienda. ¿Eso significa queB=1
no se escribirá en el caché antes delA=1
?Supongamos en CPU1 los siguientes comandos se ejecutan:
mientras que (B = 0);
impresión A
¿Es suficiente con añadir solamente lfence entre las while
y print
comandos en CPU1 sin añadir un sfence entre A=1
y B=1
en CPU0 conseguir 1 siempre impreso en x86?
while (B=0);
lfence
print A
Incluso si x86 lo garantiza, ¿por qué correr el riesgo? ¿Por qué no usar las barreras adecuadas? –
Zan, puede ser una ventaja en muchos lugares si la CPU lo garantiza. Por ejemplo, los spinlocks se implementan sin usar ningún prefijo de bloqueo en kernel porque pueden permitírselo. Y la valla no es la solución a esta pregunta, de lo contrario, uno necesita usar un candado adecuado. – Saurabh
La respuesta a la ** 1ª pregunta: Sí **. La respuesta a la pregunta ** 2-nd: sí, pero solo en el ensamblador (no en C/C++) **. Como se dijo correctamente, 'LFENCE' aquí no es necesario en x86 - proporciona consistencia de adquisición automáticamente. Tenga en cuenta que la CPU x86 no puede reordenar 'load' y las siguientes instrucciones, pero C/C++ puede reordenarlo. En C++, debes usar ** adquirir consistencia **: 'extern std :: atomic B;' 'while (B.load (std :: memory_order_acquire) == 0);' 'std :: cout << A; http://en.cppreference.com/w/cpp/atomic/memory_order –
Alex