C内存模型 – 此示例是否包含数据竞赛?

我正在阅读Bjarne Stroustrup的C 11常见问题解答,而且我无法理解 memory model部分的一个例子.

他给出以下代码片段:

// start with x==0 and y==0
if (x) y = 1; // thread 1
if (y) x = 1; // thread 2

常见问题说,这里没有数据竞赛.我不明白内存位置x由线程1读取并由线程2写入,而不进行任何同步(同样适用于y).这是两个访问,其中一个是写.数据竞赛的定义不是吗?

此外,它说“每当前的C编译器(我知道)给出一个正确的答案.这是一个正确的答案?根据一个线程的比较是否在另一个线程的写入之前或之后发生(或者如果另一个线程的写入对于读取线程是甚至可见的),答案是否不同?

// start with x==0 and y==0
if (x) y = 1; // thread 1
if (y) x = 1; // thread 2

既然x和y都不是真的,那么其他的也不会被设置为true.无论执行指令的顺序如何,(正确)结果总是x保持为0,y保持为0.

相关文章
相关标签/搜索