![](/img/trans.png)
[英]atomic exchange with memory_order_acquire and memory_order_release
[英]Can std::memory_order_acquire and memory_order_release be used separately?
cppreference表示std::memory_order_acquire
將阻止讀取和寫入在此之前重新排序。 因此,我可以使用std::memory_order_acquire
只是為了防止在沒有相應std::memory_order_release
情況下在運行時重新排序。 例如
#include <atomic>
#include <stdint.h>
std::atomic<uint32_t> g_counter{};//Counter for thread in Fun
std::atomic<void*> g_data{};
void Fun()
{
g_counter.fetch_add(1, std::memory_order_acquire);//Warning:`fetch_add` maybe reorder after next 'load'
void *data = g_data.load(std::memory_order_acquire);
g_counter.fetch_sub(1, std::memory_order_relaxed);//just memory_order_relaxed will be ok
}
真的嗎?
經過幾天的學習。 我認為'release'和'acuire'可以分別使用以防止相應的重新排序。 但是這個例子有問題。 那是一個關於'fetch_add'的存儲操作,並且該存儲可能在下一次加載后重新排序。 正確的方法是將fetch_add和下一個加載都更改為memory_order_seq_cst操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.