2010-09-13 53 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會照顧同步 - 你不需要打擾。但是在某些情況下,由於同步,消費者可能會經歷顯着的減速。

相關問題