将相同的值重新写入内存位置是否算作修改内存?(在多线程的情况下)

Ami*_*mit 5 c++ multithreading memory-model c++11 data-race

(假设:int x{ 6 }并且2个评价x = 6同时写入)

--

CPP 参考资料中提到内存模型:线程和数据竞争

一个表达式的计算写入一个内存位置另一个计算读取修改同一内存位置时,这些表达式被称为冲突。具有两个相互冲突的评估的程序会发生数据竞争,除非:

  • 两个评估在同一线程或同一信号处理程序中执行,或者

  • 两个相互冲突的求值都是原子操作(参见 std::atomic),或者

  • 一个相互冲突的评估发生在另一个评估之前(请参阅 std::memory_order)。

如果发生数据竞争,则程序的行为是不确定的。

参考文献说:“另一评价修改;它没有说“另一篇评论写道

--

C++ 标准关于6.9.2.2 数据竞争的规定:

  1. 如果两个表达式求值之一修改内存位置 ([intro.memory]),而另一个表达式求值读取修改同一内存位置,则两个表达式求值会发生冲突。

--

将相同的值重新写入内存位置是否算作修改内存?

use*_*522 5

将相同的值写入内存位置是否算作修改内存?

是的,例如,定义对标量对象(即内存位置实际上是位字段的例外)的简单赋值来修改对象,无论对象要更改为什么值。请参阅[expr.ass]/2

  1. 在简单赋值 (=) 中,通过用右操作数的结果替换其值来修改左操作数引用的对象([defns.access])。

您会发现影响标量对象值的所有其他表达式都有类似的措辞。


关于术语,标准通常不使用“ write ”,而是使用含义相同的“ modify ”。参见例如[defns.access]