这会在没有任何竞争条件下执行

时间:2011-08-30 08:40:44

标签: c++ c atomic

假设我有两个不同的线程T1和T2执行此代码,这些线程可能在两个不同的内核上运行。请注意,此代码重复执行,x最初为0,因此T1首次通过while循环。

它是否会确定性地运作并且没有竞争条件。我在这里需要锁或原子变量吗?

另请注意,只有T1修改参考值,并且在T2再次将x设置为0之前不会触摸它。此外,使用的所有变量都是整数。

我很想知道它可能出错的情况。如果有人为我提供示例方案,我将不胜感激。

修改

假设平台是x86。

T1

r = modify_and_get_reference_value();
while ( x != 0 )
 ;
x = r;

T2

while( x != get_reference_value() )
 ;
x = 0;

1 个答案:

答案 0 :(得分:4)

经验法则:不同的线程在不同的行星上执行,每个行星使用自己的主内存副本在子线程启动时创建,并且只在绝对必要时才更新。除非您使用同步或原子类型,否则它们从不进行通信,并且每个永远不会看到对方做出的内存更改结果。

这不是所有代码的最坏情况,所以它不是唯一要考虑的情况,但我认为如果你不使用任何锁或原子变量会破坏你的代码 - 每个线程只会查看它自己的版本x的{​​{1}},他们从不允许值在两者之间同步。因此代码会有数据竞争。