【发布时间】:2017-08-25 15:42:39
【问题描述】:
考虑这段代码,其中x 和y 是整数:
if (x)
y = 42;
是否允许以下编译器转换?
int tmp = y;
y = 42;
if (!x)
y = tmp;
上下文:
这是来自 Bjarne Stroustrup 的常见问题解答:
// start with x==0 and y==0
if (x) y = 1; // Thread 1
if (y) x = 1; // Thread 2
常见问题解答指出这是免费的数据竞争;如果x 和y 都为0,则不应写入任何变量。
但是如果允许转换呢?
【问题讨论】:
-
是的(但它当然不能真正使用名称
tmp)。但是你为什么在乎呢? -
@BaummitAugen 真的吗?如果可以从其他线程访问
y,则转换可能会引入没有数据竞争的数据竞争。 -
@hvd 没有其他线程可以更改
x或访问y;那已经是UB了。明确地说:要么不会有新的比赛,要么之前的代码被破坏了。 (除非x是std::atomic<int>,但Q 没有这么说。) -
@hvd 这就是为什么你必须提供同步。 as-of 规则假设只有一个线程
-
@BaummitAugen 假设
x是0并且从未修改过。假设两个线程运行 OP 的代码。那里没有 UB,即使没有同步。
标签: c++ multithreading c++11 data-race