获取/释放语义

时间:2016-07-18 13:15:04

标签: multithreading c++11 lock-free stdatomic

在答案中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。本文包含:enter image description here

并且写出确保r2 == 42。我不明白为什么。在我看来,它是可能的: 1. Thread2执行第一行。它是原子的,它是memory_order_acquire,因此必须在执行内存操作之前执行它。

  1. 现在,Thread2执行第二行:int r2 = Ar2等于0

  2. 然后,Thread1将执行他的代码。

  3. 为什么我错了?

1 个答案:

答案 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