【发布时间】:2020-07-23 02:36:31
【问题描述】:
Std::thread::join 被称为“同步”加入的线程,但是同步并不能说明副作用的可见性,它只是控制可见性的顺序,即。在下面的例子中:
int g_i = 0;
int main()
{
auto fn = [&] {g_i = 1;};
std::thread t1(fn);
t1.join();
return g_i;
}
我们有c++ 标准中的任何保证该程序将始终返回 1 吗?
【问题讨论】:
-
@CodyGray 我不明白结束这个问题,是的,以前可能有人问过,但答案是“没关系,相信我”。我在这里想要的是一些 C++ 大师,他可以告诉我为什么这适用于一些参考/权威
-
您没有表明您已经阅读了其他答案或您之前做过任何研究。因此,我想你没有看到他们,他们会回答你的问题。如果您正在寻找更多的东西,您应该在问题中明确说明,不仅要清楚地证明它不是重复的,还要让人们可以相应地调整他们的答案。
-
无法回答已结束的问题,但答案是肯定的。 memory_order 中(模糊地)描述了它。虽然它似乎是在某些情况下对原子的描述(见下一条评论),但它也适用于同步的非原子。
-
来自draft 1) §33.3.2.5-4
join()- [...]同步:this * 所代表的线程的完成与 (6.8.2 ) 对应的成功 join() return[...] 2) §6.8.2.1-(8.2) [...][注:关系“is dependency-ordered before”类似于“与同步”,但使用释放/消耗代替释放/获取。- 尾注][...] 3) §6.8.2.1-9 [...]评估 A 线程间如果 [...] (9.1)A 与 B 同步,或者 (9.2)A 在 B[...] 之前是依赖排序的,则在评估 B 之前发生 -
@user1810087 如果您想试一试,它已重新打开。
标签: c++ multithreading language-lawyer