小编Gam*_*dot的帖子

此示例是否包含数据争用?

这是最初的问题,但我的问题与它有一些不同。C++ 内存模型 - 此示例是否包含数据争用?

我的问题:

//CODE-1: initially, x == 0 and y == 0
if (x) y++; // pthread 1
if (y) x++; // pthread 2
Run Code Online (Sandbox Code Playgroud)

注意:上面的代码是用 C 编写的,而不是 C++(没有内存模型)。那么它是否包含数据竞争?

从我的角度来看:如果我们在顺序一致性内存模型中查看代码,则不存在数据竞争,因为 x 和 y 永远不会同时为非零。但是,我们永远不能假设顺序一致性内存模型,因此编译器重新排序可以进行尊重线程内正确性的转换,因为编译器不知道线程的存在......对吗?

所以代码可以改写为:

//CODE-2
y++; if (!x) y--;
x++; if (!y) x--;
Run Code Online (Sandbox Code Playgroud)

上面的转换没有违反顺序正确性,所以它是正确的。这不是编译器的错,对吧?所以我同意 CODE-1 包含数据竞争的观点。你呢?

我有一个额外的问题,带有内存模型的 C++11 可以解决这个数据竞争,因为编译器知道线程,所以他们会根据内存模型类型进行重新排序,对吧?

c multithreading memory-model java-memory-model c++11

5
推荐指数
1
解决办法
2049
查看次数

不透明函数调用在编译器优化中意味着什么?

不透明函数调用在编译器优化中意味着什么?我在为什么全局变量会给函数调用中的编译器优化带来麻烦?,而“不透明函数调用”确实让我感到困惑。不透明函数调用似乎是编译器没有任何信息的函数调用。但是这是什么意思?

c compiler-construction concurrency multithreading lock-free

0
推荐指数
1
解决办法
980
查看次数