【发布时间】:2018-01-05 07:45:32
【问题描述】:
这是原始问题,但我的问题与它有一些不同。 C++ memory model - does this example contain a data race?
我的问题:
//CODE-1: initially, x == 0 and y == 0
if (x) y++; // pthread 1
if (y) x++; // pthread 2
注意:上面的代码是用 C 编写的,而不是 C++(没有内存模型)。那么它是否包含数据竞争?
在我看来:如果我们在顺序一致性内存模型中查看代码,则不会存在数据竞争,因为 x 和 y 永远不会同时为非零。但是,我们永远不能假设一个顺序一致性内存模型,因此编译器重新排序可以对线程内正确性进行转换,因为编译器不知道线程的存在......。对吗?
所以代码可以转换为:
//CODE-2
y++; if (!x) y--;
x++; if (!y) x--;
上面的转换并没有违反顺序正确性所以是正确的。这不是编译器的错,对吧?所以我同意 CODE-1 包含数据竞争的观点。你呢?
我有一个额外的问题,带有内存模型的 C++11 可以解决这种数据竞争,因为编译器知道线程,所以他们会根据内存模型类型重新排序,对吧?
【问题讨论】:
-
在多线程环境中对共享资源的访问应该受到保护。这可以通过使用互斥锁来完成。如果
x和/或y未在线程(函数)本地定义,则x和/或y是共享资源并且存在访问它们的竞争。 -
是的,除非两个线程同步它们对
x和y的访问,否则存在竞争条件。而 C++11 更新的内存模型并没有改变这一点。 -
@Peter Thx,所以你的意思是用 C 编写的 CODE-1 包含数据竞争?
-
@alk 谢谢。所以我的理解是对的?
-
如果编译器可以无中生有地发明写入,那么任何事情都可能是不正当的,在这样的实现中对竞争进行推理是没有意义的。无论您使用哪种同步,编译器都可以在受保护的块之外发明对共享资源的写入,然后繁荣,竞争。
标签: c multithreading c++11 java-memory-model memory-model