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"?我的假设是它实际上是安全的.
§1.10[intro.multithread](引用N4140):
6 如果其中一个修改了内存位置(1.7)而另一个访问或修改了相同的内存位置,则两个表达式评估会发生冲突.
23 如果,两个行动可能同时发生
- 它们由不同的线程执行,或者
- 它们没有排序,至少有一个是由信号处理程序执行的.
程序的执行包含数据竞争,如果它包含两个可能同时发生冲突的动作,其中至少有一个不是原子的,并且除了下面描述的信号处理程序的特殊情况之外,它们都不会发生在另一个之前.任何此类数据争用都会导致未定义的行为.
你的一个线程读取a
,另一个写入a
,既不是原子的,这两个潜在的并发冲突动作都不会发生在另一个之前.因此,您有数据竞争和未定义的行为.