繁体   English   中英

来自多个线程的COM调用

[英]COM calls from multiple threads

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

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

COM代表COM服务器处理线程。 服务器使用ThreadingModel注册表项发布它支持的线程类型。 非常常见的设置是“公寓”或“两者”。 免费是非常罕见的。 缺少密钥等同于Apartment。

COM需要用于单元线程服务器的单线程单元(STA)。 如果不提供(CoInitialize / Ex调用),它将为服务器创建一个专用线程。 对STA线程的一个严格要求是它还会产生Windows消息循环。 消息循环是一种机制,COM通过该机制自动将一个线程之间的方法调用封送给另一个线程。

因此,对您问题的一般回答是,是的,它通常是线程安全的。 仍有可能出错的地方。 当从工作线程进行调用但STA线程未启动时,可能会发生死锁。 否则服务器可能会对其注册的ThreadingModel轻描淡写。 在.NET中实现的服务器并不少见。 它们被注册为Both,但是实际上很少有.NET类是线程安全的。

看到这篇非常珍贵的文章 基本上,COM将负责同步-您无需费心。 但是,在某些情况下,由于同步,消费者可能会经历明显的减速。

取决于COM对象的线程模型。 如果它是自由螺纹,则您要负责线程安全。 如果它在单线程单元中,则只能从一个线程中调用它;如果在多线程单元中,则可以,但与往常一样,您必须考虑对象状态的含义。 SO上有一个很好的答案, 您能解释一下STA和MTA吗? 解释这个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM