我理解C++ 11中內存排序的基本規則,特別是release-acquire排序。我在兩個線程之間共享了一大塊內存,我不需要原子性,但是要確保線程完成的所有更改最終都可以在另一個線程中看到,尤其是在具有寬鬆內存模型的平臺上。不鎖定線程之間的數據可見性
可以簡單地使用原子防護變量var來觸發內存同步嗎?例如,
std::atomic<bool> guardVar;
char *shared_mem=get_shared_mem();
(thread 1)
while(true) {
happens_many_things();
do_whatever_I_want_with_shared_mem();
guardVar.store(0, std::memory_order_release);
}
(in thread 2)
while(true) {
guardVar.load(std::memory_order_acquire);
read_shared_mem_no_problem_if_inconsistent();
}
再次,這是不是一個問題,如果線程2 do_whatever_I_want_with_shared_mem(),我只是想確保我得到線程1所寫的所有變化的中間讀「半就緒」狀態在一個明確的點之後。
基於this article它應該工作,但我沒有在網絡上看到這樣的解決方案,並且不容易測試它是否真的按照我的意圖進行測試。
可以嗎?如果是這樣,有沒有更優雅的方式?
嗯。你是對的,這確實是一個未定義的行爲。 – Ferenc
嗯。你說得對,這是標準確實是一個未定義的行爲。 想象一下,我模擬一個幀緩衝區,一個線程在隨機訪問中連續寫入的內容,另一個線程想定期讀出整個緩衝區來處理它。撕裂不是問題。 我怎樣才能解決這個沒有任何類型的鎖定在任何線程? – Ferenc
@Ferenc這個場景確實是你問題的一部分..我會更新答案 – LWimsey