使用COINIT_MULTITHREADED参数,CoInitializeEx使得Apartment类型组件创建于与创建线程不同的套间中。
为什么要这么作?应用于什么情况下?
迷惑中。。。
创建一个多线程套间来执行组件调用
在这个多线程套间中,创建Apartment类型组件,创建后还是位于另外一个STA套间中。有什么用?
我得问题是:什么情况下用到COINIT_MULTITHREADED,而不能用COINIT_COINIT_APARTMENTTHREADED?
》》COINIT_MULTITHREADED用于自由线程组件
对不起,没看清你得回答。
你的意思是--COINIT_MULTITHREADED只应用于自由线程组件?
这是个关于COM的套间(Apartment)概念的问题。想调用COM组件或者想以COM组件的方式被人调用都必须加入
到某个套间,可以是MTA,抑或STA。COM人为造出一个套间的概念就是为了简易COM组件的编程模型。有了套间
你只需申明自己的组件运行在某种套间中,COM的运行时会帮你打理多线程访问你组件的并发问题和reentrance
问题。COINIT_MULTITHREADED就是告诉COM运行时说我这个线程加入MTA,任何我想创建的,并且申明为STA的组件
你不能在我这个线程里创建,你COM运行时建立一个STA的线程把组件建立在那个线程里。
>>COINIT_MULTITHREADED就是告诉COM运行时说我这个线程加入MTA,任何我想创建的,并且申明为STA的组件
>>你不能在我这个线程里创建,你COM运行时建立一个STA的线程把组件建立在那个线程里。
谢谢!但什么情况下,会有这种需求--"你COM运行时建立一个STA的线程把组件建立在那个线程里。"?
还是哪个问题:什么情况下适用于--COINIT_MULTITHREADED,而不能用COINIT_COINIT_APARTMENTTHREADED?
>谢谢!但什么情况下,会有这种需求--"你COM运行时建立一个STA的线程把组件建立在那个线程里。"?
比如说,你用COINIT_MULTITHREADED让你的线程加入了MTA,也就是多线程套间,你发现你要调用的组件是STA
如果COM把这个STA建立在你的线程里会有什么后果?由于你MTA的里面的其他线程兄弟和你是一个套间,对组件的
调用都是直接的,当兄弟们都调用这个STA组件的时候,他会疯掉,他会诉苦说偶是STA哦,设计的时候就是
单线程调用偶哦,因为偶里面数据都没为多线程的并发访问设想过。
>>什么情况下适用于--COINIT_MULTITHREADED,而不能用COINIT_COINIT_APARTMENTTHREADED?
如上所说,如果你调用的组件标志为MTA的时候,他根本不怕并发访问。也不是不能用COINIT_COINIT_APARTMENTTHREADED,只是这时候轮它看不起你了,他本来就设计了并发访问,你却害怕使用它。
让它待在MTA里,你龟缩在STA里。
对于STA组件,无论客户端是什么方式初始化,它总是创建在STA中;
对于Free组件,无论客户端是什么方式初始化,它总是创建在MTA中;
对于both组件,如果客户端以STA初始化,它创建在STA中,如果客户端以MTA初始化,它创建在MTA中。
只要创建在MTA中的组件,都能跨线程直接访问而无需列集。
不是遇到过,我自己就做过free的组件,线程同步和数据锁完全依靠自己。
理论上你能永远使用MTA来初始化,或许性能稍微好些,但是前提是你使用的组件支持both才能出效果,不过现实中apartment的组件居多。
另外,如果使用MFC,一定要用STA来初始化,否则可能出现程序挂起的情况,微软知识库有篇文章专门讲了这个。