INFO:OLE 线程模型的说明和工作方式

转载地址:http://support.microsoft.com/kb/q150777/

 

COM 对象可以用于一个进程的多线程。“单线程单元” (STA) 和“多线程单元” (MTA) 术语用于为描述对象与线程间的关系、对象间的并行关系、使用何种方法将调用传递给对象的方式以及在线程间传递接口指针的规则而建立的概念框架。组件及其客户可以在 COM 目前支持的以下两个单元模型之间进行选择:

  1. 单线程单元模型 (STA):进程中一个或多个线程使用 COM ,并且 COM 对象的调用由 COM 进行同步。在线程间对接口进行编组。单线程单元模型的退化情况(其中,在给定的进程中只有一个线程使用 COM)被称为单线程模型。以前的 Microsoft 信息与文档曾经将 STA 模型简单地称为“单元模型”。
  2. 多线程单元模型 (MTA):一个或多个线程使用 COM,并且由所有与 MTA 有关的线程直接调用与 MTA 有关的 COM 对象,而在调用者和对象间没有系统代码的插入。由于多个同步客户可能将或多或少地同时调用对象(同时在多个处理器系统上),所以对象必须自己同步其内部状态。在线程间没有接口编组。以前的 Microsoft 信息与文档曾经将此模型称为“自由线程模型”。
  3. STA 模型和 MTA 模型均可以用于同一进程。有时这种模型被称为“混合模型”的进程。
在 NT 4.0 中有关于 MTA 的介绍,且在配备 DCOM95 的 Windows 95 中可以找到。在 Windows NT 3.51 和 Windows 95 以及 NT 4.0 和带有 DCOM95 的 Windows 95 中均有 STA 模型。
回到顶端

更多信息



下表总结了客户线程在作为进程内服务器实现的类上第一次调用 CoGetClassObject 时,不同线程模型之间的相互作用。

客户/线程的类型:

  • 客户在一个与“主”STA 相关的线程(用 COINIT_APARTMENTTHREADED 标记调用 CoInitialize 或 CoInitializeEx 的第一个线程)中运行 — 这称为 STA0 (也称为单线程模型)。
  • 客户在一个与任何其它 STA [ASCII 150] 相关的线程中运行,称为 STA*。
  • 客户在一个与相关 MTA 的线程中运行。
DLL 服务器的类型:

  • 服务器没有 ThreadingModel 项 — 称为“无”。
  • 服务器标为“单元” — 称为“单元”。
  • 服务器标为“自由”。
  • 服务器标为“两者”。
在查看下表时,请记住上述有关将服务器“加载”到一个单元中的定义。
客户       服务器      结果
------     ------     -----------------------------------------
STA0         无       直接访问; 服务器加载到 STA0
STA*         无       代理访问; 服务器加载到 STA0。 
MTA          无       代理访问; 服务器加载到 STA0; 如有必要,STA0 由 COM 自动创建;
STA0        单元      直接访问; 服务器加载到 STA0
STA*        单元      直接访问; 服务器加载到 STA*
MTA         单元      代理访问; 服务器加载到一个由 COM 自动创建的 STA。
STA0        自由      代理访问; 服务器加载到 MTA 如果必要 MTA 由 COM 自动创建。
STA*        自由      与 STA0->自由相同
MTA         自由      直接访问
STA0        两者      直接访问; 服务器加载到 STA0
STA*        两者      直接访问; 服务器加载到 STA*
MTA         两者      直接访问; 服务器加载到 MTA

你可能感兴趣的:(多线程,工作,windows,服务器,Microsoft,文档)