L4a MM Examples
L4a MM Examples
x = 0;
Example 1 Should this code ever print 0?
y = 0;
z = 0;
Thread 1: Thread 2: Thread 3:
x.store(1, memory_order_relaxed); while (y.load(memory_order_acquire)!=2); while (z.load(memory_order_acquire)!=4);
y.store(3, memory_order_relaxed);
x.store(5, memory_order_relaxed);
y.store(3, memory_order_relaxed);
x.store(5, memory_order_relaxed);
http://svr-pes20-cppmem.cl.cam.ac.uk/cppmem/
int main() {
atomic_int x=0;
atomic_int y=0;
atomic_int z=0;
{{{ { x.store(1, relaxed); y.store(2, release); }
||| { y.load(acquire).readsvalue(2); y.store(3, relaxed); z.store(4, release);
x.store(5, relaxed); }
||| { z.load(acquire).readsvalue(4); r1 = x.load(relaxed); }
CS3211 L4a - Memory Model - Additional Examples }}}; 6
return 0;
}
Initially: x = 0; y = 0; z = 0;
Should this code ever print 0?
x = 0;
Example 2
y = 0;
z = 0;
Thread 1: Thread 2: Thread 3:
x.store(1, memory_order_relaxed); r1 = y.load(memory_order_acquire); while (z.load(memory_order_acquire)!=4);
y.store(3, memory_order_relaxed);
x.store(5, memory_order_relaxed);
x = 0;
Example 3 Should this code ever print 0?
y = 0;
z = 0; Thread 1: Thread 2: Thread 3:
x = 1 while (y.load(memory_order_acquire)!=2); while (z.load(memory_order_acquire)!=4);
y.store(3, memory_order_relaxed);
x = 3;
x = 0;
Example 4 Should this code ever print 0?
y = 0;
z = 0;
Thread 1: Thread 2: Thread 3:
x.store(1, memory_order_relaxed); while (y.load(memory_order_acquire)!=2); while (y.load(memory_order_acquire)!=2 );
x.store(5, memory_order_relaxed);