簡體   English   中英

可以使用std :: atomic內存屏障在線程之間傳輸非原子數據嗎?

[英]Can std::atomic memory barriers be used to transfer non-atomic data between threads?

以下代碼標准是否合規? (或者它可以在不使x原子或volatile情況下使其兼容嗎?)

這與之前的問題類似,但是我想引用C ++標准的相關部分。

我擔心的是,atomic store()load()沒有為非原子變量(下例中的x load()提供足夠的編譯器障礙,以便正確釋放和獲取語義。

我的目標是實現無鎖原語,例如隊列,可以在線程之間傳遞指向常規C ++數據結構的指針。

#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>

int x; // regular variable, could be a complex data structure

std::atomic<int> flag { 0 };

void writer_thread() {
    x = 42;
    // release value x to reader thread
    flag.store(1, std::memory_order_release);
}

bool poll() {
    return (flag.load(std::memory_order_acquire) == 1);
}

int main() {
    x = 0;

    std::thread t(writer_thread);

    // "reader thread" ...  
    // sleep-wait is just for the test.
    // production code calls poll() at specific points

    while (!poll())
      std::this_thread::sleep_for(std::chrono::milliseconds(50));

    std::cout << x << std::endl;

    t.join();
}

有了獲得/釋放,是的,這就足夠了。 相關引號(來自cppreference - 在大多數情況下作為標准):

記憶模型

當表達式的評估寫入內存位置而另一個評估讀取或修改相同的內存位置時,表達式會發生沖突。 具有兩個沖突評估的程序具有數據競爭,除非兩者之一

  • 兩個沖突的評估都是原子操作(參見std::atomic
  • 其中一個沖突的評估發生在另一個之前 (參見std::memory_order

的std :: memory_order

發布 - 獲取訂購

如果線程A中的原子存儲被標記為memory_order_release並且來自同一變量的線程B中的原子加載被標記為memory_order_acquire ,那么從線程的memory_order_acquire ,所有內存都在原子存儲之前寫入(非原子和放松原子) A,在線程B中成為可見的副作用,也就是說, 一旦原子加載完成,線程B就可以保證看到線程A寫入內存的所有內容。

暫無
暫無

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

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