簡體   English   中英

memory_order_relaxed的使用

[英]Uses of memory_order_relaxed

Stackoverflow上已經有一些問題主要詢問memory_order_relaxed的用例,例如:

了解memory_order_relaxed

memory_order_relaxed有哪些用例

但是,我仍然對memory_order_relaxed的精確語義感到困惑。 通常, memory_order_relaxed的示例用例類似於std::shared_ptr - 基本上它保留了原子計數器,但它不需要與其他線程同步。

好的,所以我的理解如下:

std::memory_order_relaxed ,當與load()一起使用時,只保證加載它的線程會以原子方式執行 - 它不保證任何關於對同一變量執行store()操作的線程的任何排序,並且它使得絕對不保證任何非原子變量的加載/存儲(即不會生成內存柵欄。)

但是memory_order_relaxed提供了任何類型的“先發生”類型排序能力, 僅關注單個原子值? 例如,如果我們有:

std::atomic_flag x = ATOMIC_FLAG_INIT;

// Thread A:
//
if (!x.test_and_set(std::memory_order_relaxed)) {
   std::cout << "Thread A got here first!" << std::endl;
}

// Thread B:
//
if (!x.test_and_set(std::memory_order_relaxed)) {
   std::cout << "Thread B got here first!" << std::endl;
}

在上面的例子中,即使我們使用了memory_order_relaxed ,我們還沒有提供一種保證的方式來推理這里的訂購嗎? 換句話說,線程A和線程B都能夠推斷出哪個線程首先設置了標志。 只是由於放松的順序,線程A和線程B都不能假設任何周圍的非原子共享變量的值,因為沒有內存柵欄。 或者我在這里不正確?

你說的沒錯。 正如您所指出的,有一些用例(例如計數器),這很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM