当我启动一个新线程时,从新启动的线程中读取任何在线程启动前初始化的变量是否安全?为什么我要问这个问题?因为一些开发人员认为它是安全的,并且在那里不使用任何显式的内存屏障。但我无法在该代码中重现任何错误。然而,文档http://msdn.microsoft.com/en-us/library/ms686355(v=vs.85).aspx并没有说这是安全的。
是的,操作系统提供了隐式屏障。它无法启动线程而不获取保护线程调度器数据结构的内部锁。我不知道是否有明确的承诺。自.NET 2.0以来,线程和ProcessThread之间不再直接对应。这个链接是由SQL Server团队要求打破的,他们想要实现一个带有纤程的线程。但是,当他们无法使其足够可靠时,他们放弃了该项目。考虑到这个项目的结果以及我所知道的没有任何主流项目再次尝试利用它的困难实现线程支持而不使用锁,我认为可以安全地假设您可以依赖隐式屏障。