簡體   English   中英

獲取/釋放內存訂購

[英]Acquire/Release Memory Ordering

在示例中:

#include <thread>
#include <atomic>
#include <cassert>
#include <vector>

std::vector<int> data;
std::atomic<int> flag = ATOMIC_VAR_INIT(0);

void thread_1()
{
    data.push_back(42);
    flag.store(1, std::memory_order_release);
}

void thread_2()
{
    int expected=1;
    while (!flag.compare_exchange_strong(expected, 2, std::memory_order_acq_rel)) {
        expected = 1;
    }
}

void thread_3()
{
    while (flag.load(std::memory_order_acquire) < 2)
        ;
    assert(data.at(0) == 42); // will never fire
}

int main()
{
    std::thread a(thread_1);
    std::thread b(thread_2);
    std::thread c(thread_3);
    a.join(); b.join(); c.join();
}

1-如果我用std :: memory_order_acquire替換thread_2中的std :: memory_order_acq_rel,我還能保證thread_3中的斷言永遠不會觸發嗎?

2 - std :: memory_order_release可以使用std :: memory_order_acquire與2個線程同步(如果2個線程正在使用獲取語義監視同一個標志)?

  1. 在線程2中你沒有任何東西可以同步 - 所以std :: memory_order_relaxed內存排序在這里更合理。

  2. 在std :: memory_order_release標記變量的存儲x同步-用的std :: memory_order_acquire標記變量的負載x甚至初始商店隨后在原子讀-修改-寫操作的序列x

暫無
暫無

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

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