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

问题描述 投票:0回答:2

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

如果定义明确,则线程1读/写x,线程2读/写y,其中xy是以下union的成员,是否仍然定义正确? ?

union {
  int x;
  double y;
};
c++ concurrency atomic
2个回答
8
投票

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

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

[介绍种族]

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


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

未定义。

如果线程1读/写x,线程2读/写y,其中x和y是以下并集的成员?

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


0
投票

尽管标准未能定义有关多线程的大多数内容(甚至不是顺序的内容,也没有定义的内容),但很明显的一点是:您不应“以任何方式同时写任何使用的变量”时间”:您必须使用互斥原语来修改顺序良好的变量。]​​>

© www.soinside.com 2019 - 2024. All rights reserved.