http://bbs.edu999.com/thread-233491-1-1.html
COM对象选择服务器模式的全面描述
CoDelphi.com
摘 要:COM对象选择服务器模式的全面描述
关键字:COM MTS 线程模型 Apartment
类 别:COM & ActiveX
CoDelphi.com版权所有,未经允许,不得进行任何形式转载
COM 使用与Win32同样的线程机制。它使用Win32 API来创建和同步线程。但线程模型在Win32和COM中是不尽相同的。
Win32线程模型
Win32 定义了两类线程。用户界面线程和工作者线程。Win32中的每个进程都可以拥有一个或多个用户界面线程和/或多个工作者线程。用户界面线程有消息循环,接受发送到窗口的消息,因此也和一个或多个窗口有关联。工作者线程用于后台处理,不与任何窗口相关联。作为开发者,使用Win32线程时,要注意另外一个主要的不同点。用户界面线程总是拥有一个或多个窗口。当有消息传递给特定的窗口时,用户界面线程负责调用合适的方法。消息循环在同一个用户界面线程中执行,而不理会是哪一个线程发来的消息,所以Windows可以保证同步的正确执行。编程人员不需要为线程同步写附加的特殊代码。然而,如果你开发工作者线程的话,就必须自己处理线程同步,防止死锁或非同步的情况出现。
COM线程模型
在COM中,线程的含义有些微差异。总共有三类COM线程模型。即:Apartment,Free和Rental线程(为MTS引入)。与Win32最类似的是用户界面线程相当于Apartment线程模型,而工作者线程相当于Free线程模型。
Apartment 线程模型(单线程Apartment)
此类线程模型在Windows NT3.51和稍后的Windows 95中作为COM的第一个版本引入。Apartment线程模型由一个多线程进程组成,其中每一线程只包括一个COM对象。单线程Apartment(STA)——也表示每个线程只能被一个Apartment调用,每个Apartment都是单线程的。所有的调用都通过Win32消息机制实现。COM保证这些调用的同步。每个线程都有自己的Apartment或者执行关系,在任一时刻只能有一个线程访问这个Apartment。Apartment中的线程只接受来自同一Apartment中其它线程的调用。调用参数需经过Apartment之间的Marshall处理。COM负责在Windows消息机制中处理Apartment间的Marshall过程。
Free线程模型(多线程Apartment)
此类模型由Windows NT4.0和Windows 95 DCOM引入,允许多个线程访问单个COM对象。使用Free线程的COM对象必须保证线程同步并且实现线程敏感的消息句柄,保证线程安全。调用不能通过Win32消息机制实现,也不能由COM来同步线程,因为同一方法可能在同一时间被多个进程访问。使用Free线程的对象应该能随时处理来自其它线程的方法调用,以及处理来自多线程的同时调用。参数直接传递到任意线程,因为所有的Free线程在同一Apartment中存在。这也称之为多线程Apartment(MTA)。
Apartment和Free线程模型并存
一个进程可能同时拥有Apartment和Free线程模型。唯一的限制是只可同时拥有一个Free线程模型,但可以有多个单线程Apartment。Apartment之间的指针和数据传递需经过Marshall处理。调用STA中的对象方法将由Win32保证同步,调用MTA中的对象方法则完全不经过同步处理。
Thread Neutral Apartment模型
使用Thread Neutral Apartment(TNA)的组件将自己标记为Free或Both模型。这里组件的实例配合调用者线程而使用调用者线程的模型。COM类对象的实例能在每次被调用时使用不通的线程模型。当线程执行COM对象中的方法,且此方法创建一个新对象时,MTS将暂停当前线程,创建一个新线程来负责对创建对象的处理。和MTA一样,TNA允许多个线程进入一个Apartment。但是,每当一个线程进入Apartment时,将锁定进入的Apartment,仅当退出时才允许其它线程进入。此类线程模型被引进MTS和COM+的原因是保证上下文切换速度。