不同的线程看到不同的执行顺序

时间:2015-07-21 09:32:56

标签: c++ multithreading c++11

这是来自http://en.cppreference.com/w/cpp/atomic/memory_order

的代码
#include <thread>
#include <atomic>
#include <cassert>

std::atomic<bool> x = {false};
std::atomic<bool> y = {false};
std::atomic<int> z = {0};

void write_x()
{
    x.store(true, std::memory_order_seq_cst);
}

void write_y()
{
    y.store(true, std::memory_order_seq_cst);
}

void read_x_then_y()
{
    while (!x.load(std::memory_order_seq_cst))
        ;
    if (y.load(std::memory_order_seq_cst)) {
        ++z;
    }
}

void read_y_then_x()
{
    while (!y.load(std::memory_order_seq_cst))
        ;
    if (x.load(std::memory_order_seq_cst)) {
        ++z;
    }
}

int main()
{
    std::thread a(write_x);
    std::thread b(write_y);
    std::thread c(read_x_then_y);
    std::thread d(read_y_then_x);
    a.join(); b.join(); c.join(); d.join();
    assert(z.load() != 0);  // will never happen
}

现在,如果我们认为由线程a和b引起的内存访问是使用不同的内存顺序参数(如std :: memory_order_relaxed)执行的,并且由c和d引起的访问保持不变,那么如何实现线程c和d看到x和y内的商店的不同顺序? (或者是否所有内存访问都允许std :: memory_order_relaxed?)

是什么导致两个不同的读者线程看到不同的执行顺序? 什么架构允许这个? 是因为缓存更新不是以相同的顺序进行的吗?

0 个答案:

没有答案
相关问题