2

我注意到 C17 标准似乎包含+=关于原子类型的复合赋值(等)的原子性的矛盾说明。

从据称是最终工作草案的N2176草案开始,6.5.16.2p3 具有:

如果 E1 具有原子类型,则复合赋值是具有 memory_order_seq_cst 内存顺序语义的读-修改-写操作。

并且 7.17.3p12 保证了读取-修改-写入操作的通常“原子”语义:

原子读-修改-写操作应始终读取在与读-修改-写操作关联的写之前存储的最后一个值(按修改顺序)。

(我也查过,5.1.2.4p5 中定义的术语是“read-modify-write”,基于斜体的使用,而不是“atomic read-modify-write”。)

但是,在 7.17.7.5 中,在讨论atomic_fetch_*函数时,我们在 p5 中有以下注释:

注意 atomic_fetch 和 modify 泛型函数的操作几乎等同于相应 op = 复合赋值运算符的操作。唯一的区别是复合赋值运算符不能保证原子操作,复合赋值运算符产生的值是对象的更新值,而 atomic_fetch 和 modify 泛型函数返回的值是之前的值原子对象。[强调我的]

这似乎与 6.5.16.2p3 相矛盾,后者实际上说复合赋值运算符确实是原子操作的。我知道注释不规范,所以如果有冲突,6.5.16.2p3 会占上风。但我想知道这是否只是 7.17.7.5p5 中的一个简单错误或缺陷,还是我遗漏了一些微妙之处。

C++23 草案 N2731 有相同的措辞。

[重读,也许他们只是想指出非原子类型上的复合赋值运算符不是原子操作的?但这仍然令人困惑,根据 7.17.7.5p1,这些atomic_fetch_*指令首先仅适用于原子整数类型。]

4

0 回答 0