Esto está haciendo en mi cabeza.G ++ CAS (__sync_val_compare_and_swap) problema necesita explicar
Estoy tratando de poner en práctica algo de código "lock-libre" y estoy usando CAS (__sync_val_compare_and_swap gcc) para hacer que levantar objetos pesados.
Mi problema se puede mostrar con el siguiente código.
volatile bool lock;
void *locktest(void *arg)
{
for (int i = 0 ; i < 100000 ; ++i)
{
// acquire a lock
while(__sync_val_compare_and_swap(&lock, false, true) == true)
{
// Spin while we don't acquire
}
// make sure we have the lock
assert(lock == true);
// release the lock
assert(__sync_val_compare_and_swap(&lock, true, false) == true);
}
}
Ok, si ejecuto el código anterior en 10 subprocesos simultáneos, todo está bien.
Sin embargo, si cambio el código para leer
// acquire a lock
while(__sync_val_compare_and_swap(&lock, lock, true) == true)
Aviso he cambiado "falsa" para "bloquear".
el infierno se desata y la afirmación
// make sure we have the lock
assert(lock == true);
incendios. ¿Alguien puede explicar por qué esto hace la diferencia?
Thx Marca.
Gracias Aidan. Creo que lo has aclarado en mi mente ... Es gracioso cómo estaba tan cerca del código que ni siquiera podía pensar. Esto era un error en algunos códigos de producción e intuitivamente pensé que estaba mal, pero no podía entender por qué. – ScaryAardvark
Sí, tiene razón ... Nuestro código de producción lo tiene como volátil y mi código de prueba rápida no. Enmendaré mi pregunta en consecuencia :) – ScaryAardvark
Aún mejor podría ser 'volátil sig_atomic_t'. –