首页 > 解决方案 > C# Thread.Join 是否保证内存一致性?

问题描述

这个 SO 问题的第一个答案引用了 Java 语言规范,大意是 Thread.Join 和 Thread.IsAlive,当在线程 T1 上从线程 T2 调用时,在 T2 检测到 T1 已终止时与 T1 同步。

我找不到任何可以与回答这个问题的 JLS 相媲美的东西:C# 是否也是如此?

如果是这样,它是否保证内存的一致性?也就是说,它是否保证 T1 对内存的所有写入对 T2 都是可见的?

标签: c#multithreading

解决方案


几年前来自 MSDN 杂志 -理论与实践中的 C# 内存模型,分为两部分。

它必须说的是:

.NET Framework 中的所有其他线程 API,例如 Thread.Start 和 ThreadPool.QueueUserWorkItem,也做出了类似的保证。事实上,几乎每个线程 API 都必须有一些屏障语义才能正常运行。这些几乎从未被记录在案,但通常可以通过简单地考虑必须具备哪些保证才能使 API 有用来推断。

(我的重点

当然,我们真正寻求的是.NET内存模型的详细信息,而不是 C#,因为它是运行时可以提供任何保证,但正如上面所建议的,我找不到任何更具体的文档。


推荐阅读