加入线程后,是访问共享数据的数据竞赛吗?
Is it a data race to access shared data after joining a thread?
执行以下代码导致数据竞赛:
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
是安全的。
相关文章:
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 潜在的数据竞赛是数据竞赛吗?
- 并行std::for_each中的数据竞赛
- 在 DirectX 中跨线程传递纹理的数据竞赛
- 仅当数据竞赛存在与锁定时,OpenMP关键部分
- 什么形式上保证了非原子变量不能看到凭空出现的值,并像理论上原子一样创造数据竞赛?
- std::future::wait 是内存障碍吗?(我无法解释这种数据竞赛)
- 加入线程后,是访问共享数据的数据竞赛吗?
- C++ mac OS X El Capitan上的openmp,Valgrind错误(数据竞赛)
- 确定是否将对象分配在静态内存块中(还是如何避免数据竞赛条件)
- C++shared_ptr和threadsantiazer报告数据竞赛
- C++内存模型——这个例子包含数据竞赛吗
- OpenMP C++与zheevr的数据竞赛
- 对共享变量的无保护访问是否总是数据竞赛
- ThreadSanitizer说我的spin_lock有数据竞赛,但如何
- 数据竞赛?段错误,但问题在哪里
- 集成瓦尔格林德输出以找出数据竞赛的位置
- c++openmp shared_ptr数据竞赛
- 使用原子<bool>的简单自旋锁中的数据竞赛
- CUDA还原和样本:数据竞赛