回答
取決於COM對象線程模型。如果它的自由線程,那麼你負責線程安全。如果它位於單線程單元中,那麼只能從一個單元中調用它,如果它位於多線程單元中,則可以但可以一直考慮對象狀態的含義。 SO Could you explain STA and MTA?對此有一個很好的解釋。
現有的COM DLL可以從STA更改爲MTA嗎? – 2010-09-13 12:03:31
不是。這一切都與原始代碼的設計有關。如果代碼不是多線程的,那麼你必須編組訪問 - 即處理它自己。 – 2010-09-13 12:13:47
我想讓我的COM對象同時被調用。從我對STA的理解來看,這是不可能的,但是如果線程模型是MTA,那麼可能呢? – 2010-09-13 12:25:47
COM負責代表COM服務器的線程處理。服務器使用ThreadingModel註冊表項發佈它支持的線程類型。很常見的設置是公寓或兩者。免費是非常罕見的。缺少的鑰匙相當於公寓。
COM需要單線程單元(STA)用於單元線程服務器。如果你不提供一個(CoInitialize/Ex調用),那麼它將爲服務器創建一個專用線程。對STA線程的硬性要求是它也會抽取Windows消息循環。消息循環是COM自動將方法調用從一個線程編組到另一個線程的機制。
所以,你的問題的一般答案是,是的,它通常是線程安全的。還有些事情可能會出錯。當從工作線程進行調用但STA線程沒有泵送時,可能發生死鎖。或者服務器可能會涉及它註冊的ThreadingModel。在.NET中實現的服務器並不少見。它們被註冊爲Both,但是實際上線程安全的.NET類很少。
請參閱this very detaled article。基本上COM會照顧同步 - 你不需要打擾。但是在某些情況下,由於同步,消費者可能會經歷顯着的減速。
- 1. ASP.NET WebService接收來自多個線程的調用
- 2. 來自工作線程的ATL示例調用(編組)從工作線程的公寓線程COM接口
- 3. 來自多個線程的指標
- 4. 來自多個線程的ISessionFactory.OpenSession()
- 5. 來自多線程程序的隨機調用百分比
- 6. 來自線程的Java方法調用
- 7. pthread_exit來自線程調用的函數
- 8. COM多線程支持
- 9. Delphi COM對象多線程
- 10. 來自VSTO Excel Addin的進程COM-DLL的異步調用?
- 11. 在STA線程中使用多線程COM對象線程
- 12. 從後臺線程調用COM Interop API?
- 13. 從WinForms GUI線程調用COM線程方法的問題?
- 14. UI線程阻塞調用COM對象的後臺線程
- 15. 基於來自調用線程的變量值關閉線程
- 16. SendBroadcast阻止來自ThreadPool的線程調用線程
- 17. 爲什麼我的`StandardOleMarshalObject` COM對象是從多個線程調用的?
- 18. J2me多線程http數據泄露來自另一個線程
- 19. 來自flex的多個異步調用
- 20. 多線程 - 計算來自多個文件的字的總量
- 21. 來自Boost.Random的多線程RNG
- 22. 多線程接收來自多個UDP客戶端的數據
- 23. 在單個線程上處理來自多個線程的請求 - .NET Core
- 24. 來自x86程序集的COM?
- 25. OpenCV的多線程調用
- 26. JFrame調用多個併發線程來更新調用者JFrame中的JProgressBar
- 27. Java - 來自兩個Web容器線程的多個請求
- 28. 從.Net調用COM調用掛起線程
- 29. 阻塞調用(等待,COM調用)在STA線程
- 30. 如果該線程來自線程池,Task.Wait是否會釋放調用線程?
這是本機C++。 – 2010-09-13 12:24:33