【问题标题】:Does a thread start have implicit memory barrier?线程启动是否有隐式内存屏障?
【发布时间】:2012-05-27 04:48:52
【问题描述】:

即当我启动一个新线程时,从新启动的线程开始读取线程之前初始化的任何变量是否安全?

UPD 我为什么要问?因为一些开发人员认为它确实有,并且没有在那里使用任何显式的内存屏障。而且我无法重现该代码中的任何错误。但是,文档 http://msdn.microsoft.com/en-us/library/ms686355(v=vs.85).aspx 并没有说这是安全的。

【问题讨论】:

  • 新线程启动没什么特别的。您需要采取相同的预防措施,就好像它是一个已经在执行的线程一样。请注意,您的链接讨论的是本机代码而不是托管代码。

标签: .net clr


【解决方案1】:

是的,操作系统提供了隐式屏障。如果不使用保护线程调度程序数据结构的内部锁,它就无法启动线程。

据我所知,这并没有明确承诺。从 .NET 2.0 开始,Thread 和 ProcessThread 之间不再有直接对应关系。应 SQL Server 团队的要求,该链接已断开,该团队希望使用光纤实现线程。这实际上并没有发生,当他们无法使其足够可靠时,他们放弃了该项目。鉴于这个项目的结果,而且我所知道的主流项目都没有尝试再次利用这一点,以及实现不使用锁的线程支持的困难,我认为可以安全地假设你可以依赖隐式障碍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2014-05-29
    • 2017-06-29
    • 2012-04-03
    • 2010-12-30
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多