深入DCOM之MTA

 

运行再MTA中的线程不需要Windows消息机制,因为COM直接通过对象的v-table来调用对象的接口,所以在MTA中的COM对象没有同步机制,需要自己通过临界区、事件等机制来实现同步,COM对象的接口指针也可以直接在MTA的线程之间传递。

组件通过调用CoInitializeEx(NULL, COINIT_MULTITHREADED)来声明支持MTA,客户端代码调用CoInitializeEx(NULL, COINIT_MULTITHREADED)创建MTA,一个进程中最多只能创建一个MTA,所以第一个调用CoInitializeEx的线程创建一个MTA,之后再调用CoInitializeEx的线程则加入该MTA

客户端和组件之间一共有八种线程模式组合,进程内的四种是: STA STA STA MTA MTA-STA MTA MTA ,同样进程外有四种。如何选择线程模式呢,基本的规则是与用户交互的组件应该使用 STA ,每个显示窗口的应用已经有一个消息循环了, STA 自然就很适合。没有用户界面的组件最好使用 MTA ,因为 MTA 模式比 STA 更快,因为不需要同步,而且 MTA MTA 的调用不需要 marshal 接口,而 STA STA 或者 MTA STA 的调用需要 marshal 接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值