2010-09-13 58 views
1

如果我从多个线程调用同一个COM函数到一个in proc COM Dll,线程安全性如何?来自多个线程的COM调用

在COM DLL中,我所有的对象都需要线程安全吗?

+0

这是本机C++。 – 2010-09-13 12:24:33

回答

0

取决于COM对象线程模型。如果它的自由线程,那么你负责线程安全。如果它位于单线程单元中,那么只能从一个单元中调用它,如果它位于多线程单元中,则可以但可以一直考虑对象状态的含义。 SO Could you explain STA and MTA?对此有一个很好的解释。

+0

现有的COM DLL可以从STA更改为MTA吗? – 2010-09-13 12:03:31

+0

不是。这一切都与原始代码的设计有关。如果代码不是多线程的,那么你必须编组访问 - 即处理它自己。 – 2010-09-13 12:13:47

+0

我想让我的COM对象同时被调用。从我对STA的理解来看,这是不可能的,但是如果线程模型是MTA,那么可能呢? – 2010-09-13 12:25:47

2

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

COM需要单线程单元(STA)用于单元线程服务器。如果你不提供一个(CoInitialize/Ex调用),那么它将为服务器创建一个专用线程。对STA线程的硬性要求是它也会抽取Windows消息循环。消息循环是COM自动将方法调用从一个线程编组到另一个线程的机制。

所以,你的问题的一般答案是,是的,它通常是线程安全的。还有些事情可能会出错。当从工作线程进行调用但STA线程没有泵送时,可能发生死锁。或者服务器可能会涉及它注册的ThreadingModel。在.NET中实现的服务器并不少见。它们被注册为Both,但是实际上线程安全的.NET类很少。

1

请参阅this very detaled article。基本上COM会照顾同步 - 你不需要打扰。但是在某些情况下,由于同步,消费者可能会经历显着的减速。

相关问题