以下代码是否会导致数据争用:
int f()
{
int i = 0;
std::thread t{[&]{ i = 1; }};
t.join();
return i;
}
i
访问中不使用互斥或原子。
Documentation of std::thread::join谈到“线程的完成与join()的相应成功返回同步”,但是我不确定在这种情况下是否有意义。
答案 0 :(得分:5)
以下代码是否会导致数据争用
不。规则是,如果您有多个线程,并且其中至少有一个是写线程,则在访问共享数据时需要同步。这里的重点是多个线程。调用join
之后,您将不再有多个线程,因此main
对i
的访问是安全的。
答案 1 :(得分:5)
如链接页面所述,
由* this标识的线程的完成与join()的相应成功返回保持同步。
这意味着t
退出之前t
中发生的任何事情(即t
中发生的任何事情)发生在{{1}之后的主线程中的所有事情之前}返回。因此,在线程t.join()
中对i
的写操作是在return语句读取t
之前发生的。因此,对i
的两次访问可能不会并发。因此,没有数据争用。