加入线程后,是访问共享数据的数据竞赛吗?

Is it a data race to access shared data after joining a thread?

本文关键字:数据 竞赛 访问共享 线程      更新时间:2023-10-16

执行以下代码导致数据竞赛:

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是安全的。