加入线程后访问共享数据是否是一场数据竞赛?

时间:2019-03-18 15:19:01

标签: c++ multithreading

以下代码是否会导致数据争用:

int f()
{
    int i = 0;
    std::thread t{[&]{ i = 1; }};
    t.join();
    return i;
}

i访问中不使用互斥或​​原子。

Documentation of std::thread::join谈到“线程的完成与join()的相应成功返回同步”,但是我不确定在这种情况下是否有意义。

2 个答案:

答案 0 :(得分:5)

  

以下代码是否会导致数据争用

不。规则是,如果您有多个线程,并且其中至少有一个是写线程,则在访问共享数据时需要同步。这里的重点是多个线程。调用join之后,您将不再有多个线程,因此maini的访问是安全的。

答案 1 :(得分:5)

如链接页面所述,

  

由* this标识的线程的完成与join()的相应成功返回保持同步。

这意味着t退出之前t中发生的任何事情(即t中发生的任何事情)发生在{{1}之后的主线程中的所有事情之前}返回。因此,在线程t.join()中对i的写操作是在return语句读取t之前发生的。因此,对i的两次访问可能不会并发。因此,没有数据争用。