簡體   English   中英

原子 RMW seq_cst 后跟原子負載獲取是否可以在 x86 上重新排序?

[英]Can atomic RMW seq_cst followed and preceded by an atomic load acquire be reordered on x86?

我有如下模式:

std::atomic_uint32_t x{};
std::atomic_bool y{};

void wait_at_y()
{
    if (!y.load(std::memory_order_acquire))     // 1
        return;

    x++;  // uses seq_cst by default            // 2

    // spin until 'y' is set 'false'
    while (y.load(std::memory_order_acquire));  // 3

    x--;  // uses seq_cst by default            // 4
}

// function run by N threads
void foo()
{
    while (running)
    {
        wait_at_y();

        // do stuff
    }
}

以這種方式編寫的wait_at_y()是否保證在 x86 上1234將完全按照這個順序執行,即不重新排序它們中的任何一個? 如果不是,需要什么來防止任何重新排序?原子記憶柵欄可能,如果是的話在哪里?

x、y 都是原子變量,所有操作都是按順序一致性進行的。

的,1、2、3、4 將完全按照這個順序執行。 您不需要在任何地方插入原子內存柵欄。

但這並不能保證您的程序是正確的。 您可以在其他地方遇到數據競賽。

暫無
暫無

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

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