假设我有两个不同的线程 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;
最佳答案
经验法则:不同的线程在不同的行星上执行,每个线程都使用在子线程启动时创建的自己的主内存拷贝,并且仅在绝对必要时进行更新。它们从不进行通信,并且每个从不看到对方对内存所做的更改的结果,除非您使用同步或原子类型。
这并不是所有代码的最坏情况,因此它不是唯一需要考虑的情况,但我认为如果您不使用任何锁或原子变量,它会破坏您的代码 - 每个线程只会查看自己的版本对于x
,它们从不允许值在两者之间同步。因此,代码会出现数据竞争。
关于c++ - 这会在没有任何竞争条件的情况下执行吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7240673/