COM对象选择服务器模式的描述

COM使用与Win32同样的线程机制。它使用Win32 API来创建和同步线程。但线程模型在Win32COM中是不尽相同的。

  Win32线程模型Win32定义了两类线程。用户界面线程和工作者线程。Win32中的每个进程都可以拥有一个或多个用户界面线程和/或多个工作者线程。用户界面线程有消息循环,接受发送到窗口的消息,因此也和一个或多个窗口有关联。工作者线程用于后台处理,不与任何窗口相关联。作为开发者,使用Win32线程时,要注意另外一个主要的不同点。用户界面线程总是拥有一个或多个窗口。当有消息传递给特定的窗口时,用户界面线程负责调用合适的方法。消息循环在同一个用户界面线程中执行,而不理会是哪一个线程发来的消息,所以Windows可以保证同步的正确执行。编程人员不需要为线程同步写附加的特殊代码。然而,如果你开发工作者线程的话,就必须自己处理线程同步,防止死锁或非同步的情况出现。

  COM线程模型在COM中,线程的含义有些微差异。总共有三类COM线程模型。即:ApartmentFreeRental线程(为MTS引入)。与Win32最类似的是用户界面线程相当于Apartment线程模型,而工作者线程相当于Free线程模型。

  Apartment线程模型(单线程Apartment

  此类线程模型在Windows NT3.51和稍后的Windows 95中作为COM的第一个版本引入。Apartment线程模型由一个多线程进程组成,其中每一线程只包括一个COM对象。单线程ApartmentSTA——也表示每个线程只能被一个Apartment调用,每个Apartment都是单线程的。所有的调用都通过Win32消息机制实现。COM保证这些调用的同步。每个线程都有自己的Apartment或者执行关系,在任一时刻只能有一个线程访问这个Apartment.Apartment中的线程只接受来自同一Apartment中其它线程的调用。调用参数需经过Apartment之间的Marshall处理。COM负责在Windows消息机制中处理Apartment间的Marshall过程。

  Free线程模型(多线程Apartment

  此类模型由Windows NT4.0Windows 95 DCOM引入,允许多个线程访问单个COM对象。使用Free线程的COM对象必须保证线程同步并且实现线程敏感的消息句柄,保证线程安全。调用不能通过Win32消息机制实现,也不能由COM来同步线程,因为同一方法可能在同一时间被多个进程访问。使用Free线程的对象应该能随时处理来自其它线程的方法调用,以及处理来自多线程的同时调用。参数直接传递到任意线程,因为所有的Free线程在同一Apartment中存在。这也称之为多线程ApartmentMTA)。

  ApartmentFree线程模型并存一个进程可能同时拥有ApartmentFree线程模型。唯一的限制是只可同时拥有一个Free线程模型,但可以有多个单线程Apartment.Apartment之间的指针和数据传递需经过Marshall处理。调用STA中的对象方法将由Win32保证同步,调用MTA中的对象方法则完全不经过同步处理。

  Thread Neutral Apartment模型使用Thread Neutral ApartmentTNA)的组件将自己标记为FreeBoth模型。这里组件的实例配合调用者线程而使用调用者线程的模型。COM类对象的实例能在每次被调用时使用不通的线程模型。当线程执行COM对象中的方法,且此方法创建一个新对象时,MTS将暂停当前线程,创建一个新线程来负责对创建对象的处理。和MTA一样,TNA允许多个线程进入一个Apartment.但是,每当一个线程进入Apartment时,将锁定进入的Apartment,仅当退出时才允许其它线程进入。此类线程模型被引进MTSCOM+的原因是保证上下文切换速度。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值