在答案中StoreStore reordering happens when compiling C++ for x86 @Peter Cordes写过
对于Acquire / Release语义,为您提供所需的订单, 最后一个商店必须是发布商店,并且必须是获取负载 第一次加载。这就是为什么我做了一个std :: atomic,即使你是 将x设置为0或1,就像标志一样。
我想问一些问题以便更好地理解它。
我也阅读了http://preshing.com/20120913/acquire-and-release-semantics。本文包含:
并且写出确保r2 == 42
。我不明白为什么。在我看来,它是可能的:
1. Thread2执行第一行。它是原子的,它是memory_order_acquire,因此必须在执行内存操作之前执行它。
现在,Thread2执行第二行:int r2 = A
和r2
等于0
。
然后,Thread1将执行他的代码。
为什么我错了?
答案 0 :(得分:6)
完整的引用是:
如果我们让两个线程都运行并找到r1 == 1,那就是 确认已传递在线程1中分配的A的值 成功进入线程2.因此,我们保证r2 == 42。
aquire-release语义只能保证
A = 42
在线程1 Ready = 1
之后不会发生
r2 = A
在线程2中的r1 = Ready
之前没有发生因此必须在线程2中检查r1
的值,以确保线程1已写入A
。问题中的场景确实可以发生,但是r1
在这种情况下将是0
。