繁体   English   中英

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

[英]Is Concurrent Non-Atomic Read/Write An Undefined Behavior?

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

如果定义良好,如果线程 1 读/写x和线程 2 读/写y是否仍然定义良好,其中xy是以下union成员?

union {
  int x;
  double y;
};

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

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

[介绍.races]

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


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

它是未定义的。

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

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

尽管该标准未能定义有关多线程的大多数内容(甚至没有定义什么是顺序的,什么是未定义的),但有一点很清楚:您不应该“同时”以任何方式写入您使用的任何变量:您必须使用互斥原语来修改有序的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM