执行以下代码导致数据竞赛:
int f()
{
int i = 0;
std::thread t{[&]{ i = 1; }};
t.join();
return i;
}
i
访问不使用静音或原子。
std :: thread :: join theads的文档谈论"线程的完成与join()相应的成功返回",但我不确定在这种情况下它是否相关。
<</p>正如链接页面所述,
*由 *与相应的成功返回()同步识别的线程的完成。
这意味着在t
退出之前发生的任何事情(即t
中发生的任何事情)发生在t.join()
返回后主线程中发生的任何事情之前发生的任何事情。因此,在线程t
中的i
写入CC_7中发生在返回语句读取i
之前。因此,对i
的两个访问不是可能并发。因此,没有数据竞赛。
执行以下代码导致数据竞赛
否。规则是,如果您有多个线程,而其中至少有一个是作者,则在访问共享数据时需要同步。这里的关键点是多个线程。致电join
后,您不再拥有一个以上的线程,因此main
的访问i
是安全的。