H
Hongjiang
Unregistered / Unconfirmed
GUEST, unregistred user!
<<<COM Threading Part 1>>>
很不好意思,前面写的不很明白.因为,在日本语键盘上敲中文实在太别扭,所以写的很短.
今天,我拼着不干活,尽量把这个问题讲清楚.还望各位多提意见.
首先,COM的Apartment概念是为了让COM的开发和使用都容易才引入Apartment概念的.但是
关于Apartment概念详细阐述的比较好的资料在国内可能比较少,所以有很多人对其理解上
存在一些疑问.这很正常,我当初为理解它也花了2周时间,参考了不少资料.
其次,marshal的问题.marshal主要是COM用来在进程间以及计算机间进行COM调用时用的,
即Proxy/stub模型.但是在进程内部有时也需要进行marshal,在下面详细阐述时,我会说明
marshal相关的问题.
要注意的是,有一些COM的基本概念在这儿我不会说明,我想在这儿的讨论
COM的人因该知道.还有,因为我用的是日语键盘,敲中文不方便,本文中
有错别字还请多包涵.上面讲了不少废话,下面言归正传.
1. COM Apartment的背景
大家都知道,在一个多线程的操作系统中,在线程中对一个多个线程公用的变量进行操作
时,线程的同步是必须的.这个变量可以是一个简单的Integer类型,也可以是一个class或是
一个COM对象. 对一个简单的Integer变量来说,线程的同步很简单,每次对它进行操作的
时候用Mutex等进行同步. 对于一个class或COM对象来说,你也可以采用对简单变量一样的
方法,但更好的方法是在其内部进行线程同步,这样便于使用.也就是说,你在实现这个class
或COM对象时,就要写线程同步代码.如果class或COM对象内部实现了线程同步,那么它就是
Thread-safe的.
现在的问题是,并不是每个人在写COM对象都保证它是Thread-safe的. 如果没有COM的
Apartment, 那么我们对所有开发的COM对象都要贴上一个标签指明它是不是Thread-safe,
这样使用这个COM对象的人才知道他如果要在多线程方式下使用这个COM对象时是不是要
进行线程同步.
COM的Runtime为了使大家不用在自己开发的COM对象上贴上这么一个标签,而开发人员
可以在没有写线程同步代码的情况下照样可以用不是Thread-safe的COM对象,引入了
Apartment.
2. COM Apartment的概念
为了解决上面所讲的Thread-safe问题,引入了COM Apartment概念.但到底COM Apartment
是什么? 大家考虑一下这个问题: 如果我写了一个不是Thread-safe的COM对象,把它交给
一个使用者,而且告述他是Thread-safe的.那么如果使用者在多线程环境下用我写
的这个COM对象就不会写线程同步代码,会出现什么情况? 答案是明显的,执行结果会
有问题. COM的Runtime为了使使用者在开发者没有告述他COM对象的Thread-safe问题的
情况下也能在各个线程模式下安全使用,要求一个COM对象能够告述COM的Runtime环境它
能在什么线程模式下被安全使用, 同时,使用者在使用一个COM对象之前,也必须告述
COM的Runtime环境他将在什么线程模式下使用这个COM对象,如果两者的线程模式不一样,
那么COM的Runtime环境就会介入,为它们完成线程的同步问题.COM Apartment就是COM的
Runtime环境对COM Client和COM对象的线程模式的包装(实际上是在TLS里面加上了线程
模式的标志). 在开发一个COM对象时开发者必须指定这个COM对象的线程模式(这一点大家
应该都已经知道了). COM对象的线程模式会在它注册时写入系统的注册表. 使用者在每个
使用COM对象的线程中必须首先调用CoInitialize,CoInitializeEx等来告述COM Runtime
环境将在那种线程模式下使用COM对象.
(to be continued)
很不好意思,前面写的不很明白.因为,在日本语键盘上敲中文实在太别扭,所以写的很短.
今天,我拼着不干活,尽量把这个问题讲清楚.还望各位多提意见.
首先,COM的Apartment概念是为了让COM的开发和使用都容易才引入Apartment概念的.但是
关于Apartment概念详细阐述的比较好的资料在国内可能比较少,所以有很多人对其理解上
存在一些疑问.这很正常,我当初为理解它也花了2周时间,参考了不少资料.
其次,marshal的问题.marshal主要是COM用来在进程间以及计算机间进行COM调用时用的,
即Proxy/stub模型.但是在进程内部有时也需要进行marshal,在下面详细阐述时,我会说明
marshal相关的问题.
要注意的是,有一些COM的基本概念在这儿我不会说明,我想在这儿的讨论
COM的人因该知道.还有,因为我用的是日语键盘,敲中文不方便,本文中
有错别字还请多包涵.上面讲了不少废话,下面言归正传.
1. COM Apartment的背景
大家都知道,在一个多线程的操作系统中,在线程中对一个多个线程公用的变量进行操作
时,线程的同步是必须的.这个变量可以是一个简单的Integer类型,也可以是一个class或是
一个COM对象. 对一个简单的Integer变量来说,线程的同步很简单,每次对它进行操作的
时候用Mutex等进行同步. 对于一个class或COM对象来说,你也可以采用对简单变量一样的
方法,但更好的方法是在其内部进行线程同步,这样便于使用.也就是说,你在实现这个class
或COM对象时,就要写线程同步代码.如果class或COM对象内部实现了线程同步,那么它就是
Thread-safe的.
现在的问题是,并不是每个人在写COM对象都保证它是Thread-safe的. 如果没有COM的
Apartment, 那么我们对所有开发的COM对象都要贴上一个标签指明它是不是Thread-safe,
这样使用这个COM对象的人才知道他如果要在多线程方式下使用这个COM对象时是不是要
进行线程同步.
COM的Runtime为了使大家不用在自己开发的COM对象上贴上这么一个标签,而开发人员
可以在没有写线程同步代码的情况下照样可以用不是Thread-safe的COM对象,引入了
Apartment.
2. COM Apartment的概念
为了解决上面所讲的Thread-safe问题,引入了COM Apartment概念.但到底COM Apartment
是什么? 大家考虑一下这个问题: 如果我写了一个不是Thread-safe的COM对象,把它交给
一个使用者,而且告述他是Thread-safe的.那么如果使用者在多线程环境下用我写
的这个COM对象就不会写线程同步代码,会出现什么情况? 答案是明显的,执行结果会
有问题. COM的Runtime为了使使用者在开发者没有告述他COM对象的Thread-safe问题的
情况下也能在各个线程模式下安全使用,要求一个COM对象能够告述COM的Runtime环境它
能在什么线程模式下被安全使用, 同时,使用者在使用一个COM对象之前,也必须告述
COM的Runtime环境他将在什么线程模式下使用这个COM对象,如果两者的线程模式不一样,
那么COM的Runtime环境就会介入,为它们完成线程的同步问题.COM Apartment就是COM的
Runtime环境对COM Client和COM对象的线程模式的包装(实际上是在TLS里面加上了线程
模式的标志). 在开发一个COM对象时开发者必须指定这个COM对象的线程模式(这一点大家
应该都已经知道了). COM对象的线程模式会在它注册时写入系统的注册表. 使用者在每个
使用COM对象的线程中必须首先调用CoInitialize,CoInitializeEx等来告述COM Runtime
环境将在那种线程模式下使用COM对象.
(to be continued)