转载地址:http://support.microsoft.com/kb/q150777/
COM 对象可以用于一个进程的多线程。“单线程单元” (STA) 和“多线程单元” (MTA) 术语用于为描述对象与线程间的关系、对象间的并行关系、使用何种方法将调用传递给对象的方式以及在线程间传递接口指针的规则而建立的概念框架。组件及其客户可以在 COM 目前支持的以下两个单元模型之间进行选择:
- 单线程单元模型 (STA):进程中一个或多个线程使用 COM ,并且 COM 对象的调用由 COM 进行同步。在线程间对接口进行编组。单线程单元模型的退化情况(其中,在给定的进程中只有一个线程使用 COM)被称为单线程模型。以前的 Microsoft 信息与文档曾经将 STA 模型简单地称为“单元模型”。
- 多线程单元模型 (MTA):一个或多个线程使用 COM,并且由所有与 MTA 有关的线程直接调用与 MTA 有关的 COM 对象,而在调用者和对象间没有系统代码的插入。由于多个同步客户可能将或多或少地同时调用对象(同时在多个处理器系统上),所以对象必须自己同步其内部状态。在线程间没有接口编组。以前的 Microsoft 信息与文档曾经将此模型称为“自由线程模型”。
- STA 模型和 MTA 模型均可以用于同一进程。有时这种模型被称为“混合模型”的进程。
更多信息
下表总结了客户线程在作为进程内服务器实现的类上第一次调用 CoGetClassObject 时,不同线程模型之间的相互作用。
客户/线程的类型:
- 客户在一个与“主”STA 相关的线程(用 COINIT_APARTMENTTHREADED 标记调用 CoInitialize 或 CoInitializeEx 的第一个线程)中运行 — 这称为 STA0 (也称为单线程模型)。
- 客户在一个与任何其它 STA [ASCII 150] 相关的线程中运行,称为 STA*。
- 客户在一个与相关 MTA 的线程中运行。
- 服务器没有 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