第12章 多线程

 
第12章 多线程

1、COM并没有定义新的线程和进程模型,而是直接使用了Win32线程。COM也没有它自己的同步源于。COM中线程的创建和同步,使用的都是常规的Win32 API。

2、Win32线程有两种不同类型的线程:用户界面线程和工作线程。

3、COM线程也有两种:套件线程,与Win32中的用户界面线程相对应;自由线程,与Win32中的工作线程相对应。4、既然COM线程与Win32并没有什么差别,那为什么Com还需要定义自己的线程呢?

其原因在于参数调整和线程同步。

5、套间:是一个由用户界面风格的线程(套间线程)和一个消息循环构成的概念性实体。

6、套间线程:指套间中仅有的唯一的线程。对于套间线程,可以将其想象成一个用户界面线程。

7、用户界面线程拥有它所创建的窗口。一个套间线程同它创建的组件之间的关系也是如此:套间线程将拥有它所创建的组件。一个套间中的组件只能由相应的套间线程调用。对与一个套间中的组件,假定另外一个线程调用一个套间中某个组件的方法,COM将把此调用请求放到套间的队列中。消息循环将取出此调用请求并在套间线程上执行相应的方法。

8、COM将在套间线程上同步对组件的调用。对于自由线程创建的组件的调用,COM不能使之同步。若某个组件是由自由线程创建的,则任意线程均可在任意时候调用它。此时组件开发者应保证对组件访问的同步。

9、调整与同步:

一般而言,在使用套间线程的情况下,所有的调整与同步处理将由COM完成。而在自由线程的情况下,调整处理可能是不需要的,而同步则需要组件自己完成。下面是一些需要记住的一般性规则:

(1)       进程间的调用将被调整。

(2)       同一线程中的调用将不被调整。

(3)       对于套间线程中组件的调用将被调整。

(4)       对于自由线程中组件的调用并不是总被调整。

(5)       对于套间线程的调用将被同步。

(6)       对于自由线程的调用将不被同步。

(7)       同一线程中的调用将由此线程本身完成同步。

10、使用套间中的组件的最大的好处在于这些组件无需是线程安全的,COM将同步对套间中组件的访问,这些访问可以是来自套间线程的,也可以是来自自由线程的。从内部实现来讲,COM将使用一个隐蔽的Windows消息队列来同步这种调用。

11、下面所列是对套间的一些关键性的需求:

(1)必须调用CoInitialize或OleInitialize。

(2)只能有一个线程。

(3)必须有一个消息循环。

(4)在将接口指针传给其他套间时,必须对之进行调整。


(5)若套间时一个进程中组件,则其DLL入口点必须是线程安全的。

(6)可能需要一个类型安全的类厂。

12、自动调整:在许多情况下,COM将自动为程序员进行接口的调整。

13、什么情况需要程序员自己对接口指针进行调整呢?

答案是在跨越套间边界但并没有通过COM进行通信时。

14、关于线程模型的注册表关键字:

组件的InprocServer32关键字下的名为ThreadingModel的名称值(注意不是子关键字)。ThreadingModel有三个可能的值:Apartment(该组件可在套间线程中使用),Free(该组件可在自由线程中使用),Both(均可)。

15、本章源码在CSDN我的资源里面可以下载。注册时也需要移到没有中文的路径才行。CSDN我的资源中InsideCOM\CHAP12

 

你可能感兴趣的:(第12章 多线程)