写入内存中相同地址之间可能存在数据争用

时间:2017-12-20 11:30:03

标签: c++ c++11 memory thread-safety

请考虑以下代码段。

T data;
T* ptr1 = &data;
T* ptr2 = &data;
*ptr1 = ...;
std::thread thread([ptr2]() {
    *ptr2 = ...;
});
thread.join();

问题:它是否引入了数据竞争?

我的想法:由于ptr1ptr2是不同的变量,因此分配和按值捕获都需要重新排序。因此,数据竞争就在那里。

这是对的吗?

2 个答案:

答案 0 :(得分:4)

线程创建意味着关系之前发生,即,给定代码中没有数据争用。实际上,*ptr1的赋值实际上发生在下一个语句之前。如果您在创建线程后重新排序代码以使*ptr1赋值,那么您将拥有数据争用:使用哪个指针引用来访问对象以创建数据争用并不重要。

答案 1 :(得分:0)

我认为这里不会有比赛。在创建新线程之前,程序运行单线程,因此执行顺序将由您编写。

Here's关于编译时内存排序的解释。

从这个页面引用一句好话:

The cardinal rule of memory reordering, which is universally followed by compiler developers and CPU vendors, could be phrased as follows: Thou shalt not modify the behavior of a single-threaded program.

相关问题