ConintializeEx的参数

什么情况下会用到CoInitializeEx(NULL,   COINIT_MULTITHREADED)?

使用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来初始化,否则可能出现程序挂起的情况,微软知识库有篇文章专门讲了这个。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值