c++ - 这会在没有任何竞争条件的情况下执行吗

标签 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;

最佳答案

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

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

关于c++ - 这会在没有任何竞争条件的情况下执行吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7240673/

相关文章:

c++ - TPCircularBuffer 中的错误 - atomic_fetch_add

c++ - 在此代码中使用 memory_order_relaxed 是否正确?

c++ - AVL Tree - 无法将根传递给插入方法

C - 在读取文件上的数字时,有没有办法区分单位、十几个或几百?

c - 重命名 gcov 文件以进行各种编译

c - 告诉伪终端的从端口名称

sql - 非原子值 SELECT 是特定于 SQL Server 的还是可能在其他 DBMS-es 中?

c++ - 不能明确专门用于 Visual Studio 2017

c++ - 在 vector 中查找字符串时遇到麻烦

c++ - 为系统托盘和 QAction (QT) 即时使用翻译