使用另一个racy变量保护racy变量是否安全?

ben*_*ben 1 c++ x86 multithreading caching volatile

void foo(volatile int& a, volatile int& b, bool threadOne) {
    if (threadOne) {
        //EDIT: switched the following two lines
        b = 10;
        a = 5;
    } else {
        while(a == 0);
        cout << a << b;
    }
}

//somewhere else
int a = 0;
int b = 0;
std::thread th1(foo, a, b, true);
std::thread th2(foo, a, b, false);
Run Code Online (Sandbox Code Playgroud)

这在x86上是否安全,即根据c ++标准和x86参考的每个合法交错指令都将打印"510"?我的假设是它实际上是安全的.

T.C*_*.C. 5

§1.10[intro.multithread](引用N4140):

6 如果其中一个修改了内存位置(1.7)而另一个访问或修改了相同的内存位置,则两个表达式评估会发生冲突.

23 如果,两个行动可能同时发生

  • 它们由不同的线程执行,或者
  • 它们没有排序,至少有一个是由信号处理程序执行的.

程序的执行包含数据竞争,如果它包含两个可能同时发生冲突的动作,其中至少有一个不是原子的,并且除了下面描述的信号处理程序的特殊情况之外,它们都不会发生在另一个之前.任何此类数据争用都会导致未定义的行为.

你的一个线程读取a,另一个写入a,既不是原子的,这两个潜在的并发冲突动作都不会发生在另一个之前.因此,您有数据竞争和未定义的行为.