圍欄的例子
上面的例子也可以用柵欄和鬆散的原子操作來實現:
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;
}
}
如果原子載入操作看到原子儲存寫入的值,則儲存在載入之前發生,並且柵欄也是如此:釋放柵欄發生在獲取柵欄之前,對釋放柵欄之前的 x
和 y
的寫入變為可見獲取圍欄之後的 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
標誌在放鬆原子載荷的幫助下設定。然後使用單個獲取圍柵來提供所需的記憶體排序。