簡體   English   中英

可以分別使用std :: memory_order_acquire和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.

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