Ste*_*fan 29 multithreading thread-safety
有时我会看到术语"自由线程"来描述一个类或一个方法.它似乎与"线程安全"具有相似或相同的含义.
这两个术语有区别吗?
Jon*_*nna 20
在其他环境中可能还有其他的东西,但在我过去使用的情况下,"自由线程"意味着它可以在不同的线程上工作,或者至少可以工作,而不需要在公寓之间进行任何编组.
相比之下,公寓穿线可以封锁不同的"公寓",并使用单独的"全局"数据副本(因此,当您考虑它时,这些数据并不是全球性的)并且要么只允许一个线程在公寓中运行,要么允许几个但是仍然与使用其他公寓的人分开.
现在,因为公寓模型提供了自己的一些线程安全性,一些(但不是全部)关于线程安全的担忧消失了.设计用于在公寓模型中运行的一段代码将是线程安全的,但部分或全部线程安全性来自公寓模型.
一个免费的线程代码必须完全保证它所声称的任何程度的线程安全性.
这意味着它几乎意味着与线程安全相同的东西,对于任何意图和目的,您不必考虑使用公寓模型代码的线程安全性.
sta*_*ica 15
我刚刚对"自由线程"的含义进行了一些研究,最后我也得到了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的术语"自由线程"本质上似乎与更通用的术语"线程安全"具有相同的含义.
PS:这个答案假设"线程安全"基本上意味着"可以处理并发访问(可能由不同的线程)".
PPS:我想知道"自由线程"是否与"具有线程关联性"相反.