2012-09-09 12 views
17

Las tiendas son operaciones de liberación y las cargas son operaciones de adquisición para ambas. Sé que memory_order_seq_cst está destinado a imponer un pedido total adicional para todas las operaciones, pero no puedo construir un ejemplo donde no sea el caso si todos los memory_order_seq_cst se reemplazan por memory_order_acq_rel.¿Cómo se diferencian memory_order_seq_cst y memory_order_acq_rel?

¿Echo de menos algo, o la diferencia es solo un efecto de documentación, es decir, uno debe usar memory_order_seq_cst si uno intenta no jugar con un modelo más relajado y usar memory_order_acq_rel al restringir el modelo relajado?

Respuesta

18

http://en.cppreference.com/w/cpp/atomic/memory_order tiene un buen ejemplo en la parte inferior que solo funciona con memory_order_seq_cst. Básicamente, memory_order_acq_rel proporciona ordenamientos de lectura y escritura en relación con la variable atómica, mientras que memory_order_seq_cst proporciona pedidos de lectura y escritura de forma global. Es decir, las operaciones secuenciales consistentes son visibles en el mismo orden en todos los hilos.

El ejemplo se reduce a esto:

bool x= false; 
bool y= false; 
int z= 0; 

a() { x= true; } 
b() { y= true; } 
c() { while (!x); if (y) z++; } 
d() { while (!y); if (x) z++; } 

// kick off a, b, c, d, join all threads 
assert(z!=0); 

Operaciones en z son vigilados por dos variables atómicas, no uno, por lo que no puede utilizar la semántica de liberación adquirir para hacer cumplir esa z siempre se incrementa.

+0

No entiendo por qué 'x = true; y = true; c(); d()' no es posible? Eso debería causar que sea 0. Además, no sé por qué obtengo 2 tantos como los resultados. –

+1

@ acidzombie24, incluso en ese caso, 'z' será 2. – MSN

+0

Me equivoqué, leí mal el código. Eso tiene perfecto sentido ahora –

Cuestiones relacionadas