来自多个线程的COM调用

时间:2010-09-13 09:55:13

标签: c++ com thread-safety

如果我从多个线程调用相同的COM函数到proc COM Dll中,那么线程安全性如何呢?

COM DLL中的所有对象是否也需要线程安全才能使其可靠地工作?

3 个答案:

答案 0 :(得分:2)

COM代表COM服务器负责线程化。服务器使用ThreadingModel注册表项发布它支持的线程类型。非常常见的设置是公寓或两者。免费是非常罕见的。缺少的钥匙相当于公寓。

COM需要单线程单元(STA)用于公寓线程服务器。如果您不提供一个(CoInitialize / Ex调用),那么它将为服务器创建一个专用线程。 STA线程的一个硬性要求是它还支持Windows消息循环。消息循环是COM自动将方法调用从一个线程封送到另一个线程的机制。

因此,对您的问题的一般答案是,是的,它通常是线程安全的。仍有可能出错的事情。当从工作线程进行调用但STA线程没有泵送时,死锁是可能的。或者服务器可能正在关注它注册的ThreadingModel。在.NET中实现的服务器并不罕见。它们被注册为Both,但很少有.NET类实际上是线程安全的。

答案 1 :(得分:1)

this very detaled article。基本上COM会处理同步 - 你不需要打扰。但是,在某些情况下,由于同步,消费者可能会遇到明显的减速。

答案 2 :(得分:0)

取决于COM对象线程模型。如果它是自由线程,那么你负责线程安全。如果它在一个单线程的公寓中,那么你只能从一个调用它,如果它在一个多线程的公寓中,那么你可以但是你可以一如既往地考虑对象状态的含义。 SO Could you explain STA and MTA?解释了这个问题,答案非常好。