1

假设我有以下代码片段:

std::atomic<int> a(0);

void thread1()
{
    int x = a.fetch_add(1, std::memory_order_relaxed);
    std::cout << x << std::endl;
}

void thread2()
{
    int x = a.fetch_add(1, std::memory_order_relaxed);
    std::cout << x << std::endl;
}

int main()
{
    std::thread t1(thread1);
    std::thread t2(thread2);

    t1.join();
    t2.join();
}

问题是:我能得到0 0结果吗?

这里两个线程都a以宽松的内存顺序读取和修改,所以看起来它们都可以看到a. 但在实践中,我只看到0 11 0

4

1 回答 1

4

不,0 0不可能。宽松的内存顺序并不意味着操作不是原子的,0 0发生的唯一方法是读取-修改-写入是非原子的。但是由于std::atomic::fetch_add是原子操作的,我们知道一次fetch_add可能只有一个操作,所以只有0 1or1 0是可能的。

于 2016-06-04T23:30:37.973 回答