并发非原子读/写是未定义的行为吗?

Koo*_*sha 0 c++ concurrency atomic

对 C++ 基本类型(多次读取和多次写入)的变量进行并发非原子读取和写入是 C++ 中的未定义行为吗?我不关心实际值,因为稍后我会发现是否发生了并发读/写,如果发生了,我会忽略当前值。我只想知道行为是否是定义良好的 C++?

如果是良好定义的,它仍然是良好定义的,如果线索1的读/写x和线程2的读/写y在,其中xy是如下的成员union

union {
  int x;
  double y;
};
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 9

对 C++ 基本类型(多次读取和多次写入)的变量进行并发非原子读取和写入是 C++ 中的未定义行为吗?

是的。标准(引自最新草案)说:

[介绍.races]

如果程序包含两个潜在的并发冲突操作,则程序的执行包含数据竞争,其中至少一个不是原子的,并且都不在另一个之前发生,除了下面描述的信号处理程序的特殊情况。任何此类数据竞争都会导致未定义的行为。...


只是想知道行为是否是定义良好的 C++?

它是未定义的。

如果线程 1 读取/写入 x 并且线程 2 读取/写入 y,其中 x 和 y 是以下联合的成员?

这可能甚至“更多”未定义,因为不仅存在数据竞争,而且还可能读取联合的非活动成员的值。