现在的位置: 首页 > 综合 > 正文

组件的多线程特性

2018年04月27日 ⁄ 综合 ⁄ 共 1310字 ⁄ 字号 评论关闭

 

1. 组件的多线程特性::
在设计COM组件的时候,需要考虑它在多线程环境中运行的情况。因为组件客户可能在多个线程中调用这个COM对象提供的功能。
Win32平台,具有两种线程,一种为UI线程,UI线程拥有自己的消息循环,可以包含窗口,通过消息循环向窗口分发消息。另一种为辅助线程,也称工作(者)线程,没有消息循环,不能处理消息,一般用作后台处理。COM中与UI对象的是套间线程(apartment thread),它的主函数中包含消息循环,与辅助线程对应的是自由线程(free thread),它的主函数中不包含消息循环。
COM规范并没有定义特有的线程模型,所以需要COM组件的实现者来保护COM对象的相关资源,即进行同步处理。
2. 组件的线程模型:
       组件的线程模型有如下5类:
单线程(Single)
单元(Apartment)
两者(Both)
自由(Free)
中性(仅实用于win2000)
       这里要重点讲解下套间的概念,套间是一个抽象的概念,它是在初始化COM库的时候指定和创建的。它的存在其实是为了更加详细的描述组件和组件之间以及组件和组件客户之间,在多线程环境中的交互规范。从而决定这些组件之间或者组件和客户之间的调用是否需要列集和散集。
       套间分为STA(单线程套间)和MTA(多线程套间),一个STA只能容纳一个COM组件对象。一个线程可以创建多个STA一个MTA是多个自由线程结合起来的自由线程组,合并起来称为MTA。所以,一个程序可以拥有多个STA,一个MTA.
       在创建一个程序的时候,默认就创建了一个主线程,用户也可以另行创建辅助线程。当要调用组件功能的时候,首先需要初始化COM库(通过CoInitialize或者CoInitializeEx初始化,并指定一个套间线程模型),初始化完毕后,就在这个线程环境中创建了一个套间(相当于划分了一块地盘)。然后通过CoCreateInstance创建组件接口指针(其实隐含的创建了一个组件对象),COM库判断此组件的线程模型是否和初始化COM库时指定的套间线程模型一样,如果一样,就直接将该组件对象放入自己的地盘。如果不一样,就要将该COM对象放入另外的套间以容纳之。
    组件对象的线程模型就是上面的5类:
1. 单线程模型:此模型指定该COM对象只能在应用程序的主线程中创建。因为主线程拥有消息循环,所以自动实现了同步处理。
2. 单元模型:此模型指定COM对象只能在STA(单线程套间)中创建和运行。因为该套间只容纳一个COM组件,跨套间之间的调用,COM对接口的调用通过列集和散集实现同步处理。
3. 两者模型:此模型表示该COM对象可以在STA或者MTA(多线程套间)中运行。组件客户可以直接获取该COM组件的接口指针。但是用户需要编写同步代码。
4. 自由模型;此模型表示该COM对象在MTA套间中创建,用户需要编写同步代码。
5. 中性:
在套间之内的调用是直接进行的,效率最高,但是需要编写同步代码。跨套间之间的调用是需要列集和散集处理的,虽然不需要编写同步代码,但是会影响性能,在设计程序的时候,要慎重考虑组件的线程模型。

 

抱歉!评论已关闭.