请考虑以下代码段。
T data;
T* ptr1 = &data;
T* ptr2 = &data;
*ptr1 = ...;
std::thread thread([ptr2]() {
*ptr2 = ...;
});
thread.join();
问题:它是否引入了数据竞争?
我的想法:由于ptr1
和ptr2
是不同的变量,因此分配和按值捕获都需要重新排序。因此,数据竞争就在那里。
这是对的吗?
答案 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.