圍欄的例子

上面的例子也可以用柵欄和鬆散的原子操作來實現:

int x, y;
std::atomic<bool> ready{false};

void init()
{
  x = 2;
  y = 3;
  atomic_thread_fence(std::memory_order_release);
  ready.store(true, std::memory_order_relaxed);
}
void use()
{
  if (ready.load(std::memory_order_relaxed))
  {
    atomic_thread_fence(std::memory_order_acquire);
    std::cout << x + y;
  }
}

如果原子載入操作看到原子儲存寫入的值,則儲存在載入之前發生,並且柵欄也是如此:釋放柵欄發生在獲取柵欄之前,對釋放柵欄之前的 xy 的寫入變為可見獲取圍欄之後的 std::cout 宣告。

如果柵欄可以減少獲取,釋放或其他同步操作的總數,則柵欄可能是有益的。例如:

void block_and_use()
{
  while (!ready.load(std::memory_order_relaxed))
    ;
  atomic_thread_fence(std::memory_order_acquire);
  std::cout << x + y;
}

block_and_use() 函式旋轉,直到 ready 標誌在放鬆原子載荷的幫助下設定。然後使用單個獲取圍柵來提供所需的記憶體排序。