“自由线程”和“线程安全”之间的区别

时间:2010-10-08 15:56:24

标签: multithreading thread-safety

有时我会看到术语“自由线程”来描述一个类或一个方法。它似乎与“线程安全”具有相似或相同的含义。

这两个术语有区别吗?

3 个答案:

答案 0 :(得分:20)

在其他情况下可能还有其他的东西,但在我过去使用的情况下,“自由线程”意味着它可以在不同的线程上工作,或者至少可以工作,而不需要在公寓之间进行任何编组。

相比之下,公寓线程会阻止不同的“公寓”与“全局”数据的单独副本(因此,当您考虑它时,这不是真正的全局),并且只允许一个线程在公寓中运行,或者允许几个,但仍然与使用其他公寓的那些分开。

现在,因为公寓模型提供了一些自己的线程安全性,一些(但不是全部)关于线程安全的担忧消失了。设计用于在公寓模型中运行的一段代码将是线程安全的,但部分或全部线程安全性来自公寓模型。

免费线程代码必须完全保证其声称自己的线程安全程度。

这意味着它几乎与线程安全相同,对于任何意图和目的,您不必考虑使用公寓模型代码的线程安全性。

答案 1 :(得分:13)

我刚刚对“自由线程”可能意味着什么进行了一些研究,最后我也得到了COM。让我首先引用1998年版Don Box的书Essential COM中的两段。 (这本书实际上包含了更多关于自由线程模型的部分,但我暂时将其留在那里。)


  

一次只在一个公寓中执行一个线程。在线程可以使用COM之前,必须先进入公寓。 [...] COM定义了两种类型的公寓:多线程公寓(MTA)和单线公寓(STA)。每个流程最多只有一个MTA;但是,进程可以包含多个STA。顾名思义,多个线程可以同时在MTA中执行,而只有一个线程可以在STA中执行。 [...]

     

- 来自第200-201页。 (我强调的重点。)


  

DLL中的每个CLSID都可以有自己独特的ThreadingModel。 [...]

     
      
  • ThreadingModel="Both"表示该类可以在MTA或STA中执行。
  •   
  • ThreadingModel="Free"表示该类只能在MTA中执行。
  •   
  • ThreadingModel="Apartment"表示该类只能在STA中执行。
  •   
  • 缺少ThreadingModel值意味着该类只能在主STA上运行。主STA被定义为在该过程中初始化的第一个STA。
  •   
     

- 来自第204页。(格式化和重点由我添加。)


我认为这意味着声明为自由线程的组件(类)在MTA中运行,其中可能存在多个线程的并发,并且明确允许从不同线程调用该组件;即。自由线程组件支持多线程环境。显然,为了达到这个目的,它必须是线程安全的。

相反的是为STA设计的组件,即。只允许来自一个特定线程的调用。这样的类不必是线程安全的(因为COM会注意除了“输入”/设置STA的人之外没有其他线程可以首先使用该组件,也就是说,COM保护组件免受并发访问)。

结论: COM的术语“自由线程”基本上与更通用的术语“线程安全”具有相同的含义。


P.S。:这个答案假定“线程安全”基本上意味着“可以处理并发访问(可能由不同的线程)。”

P.P.S。:我想知道“自由线程”是否与“具有线程关联性”相反。

答案 2 :(得分:0)

“自由线程”和“线程安全”有不同的含义。例如,ASP.NET 可以使用“应用程序状态”在不同的 Web 会话和应用程序用户(又名 IIS 虚拟目录和所有子目录)之间共享数据。微软帮助说:

https://docs.microsoft.com/en-us/previous-versions/aspnet/ms178594(v=vs.100)

<块引用>

应用程序状态是自由线程的,这意味着应用程序状态 数据可以被多个线程同时访问。因此它是 重要的是要确保在更新应用程序状态数据时,您 通过包含内置同步以线程安全的方式执行此操作 支持。您可以使用 Lock 和 UnLock 方法来确保数据 通过锁定数据以仅由一个源写入的完整性 时间。

因此,我理解“应用状态”可以同时读取;但是要更新其内容,您的 ASP.NET 源代码必须使用锁定和解锁操作。

它可以将理解扩展到COM域。 MTA 单元的“free-threaded”是指线程可以同时读取COM 数据;但要在MTA 中更新COM 数据,您的源代码应自行使用同步方式。另一方面,STA 对 COM 本身来说是“线程安全的”。您的程序可以直接轻松地访问 STA 数据。