COM組件中的線程模式

來源:互聯網
上載者:User

 提及COM的線程模式,實際上指的是兩個方面,一個是客戶程式的線程模式,一個是組件所支援的線程模式。客戶程式的線程模式只有兩種,單線程公寓
(STA)和多線程公寓(MTA)。組件所支援的線程模式有四種:Single(單線程)、Apartment(STA)、Free(MTA)、
Both(STA+MTA)。

  1、公寓只是個邏輯上的概念。一個STA只能包含一個線程,一個MTA可以包含多個線程。一個進程可以包含多個STA,但只能有一個MTA。
MTA中各線程可以並行的調用本公寓內執行個體化的組件,而不需要進行調度。跨公寓調用組件執行個體必須要進行調度。(除非使用了自由線程調度器)

  2、客戶程式的線程是在調用CoInitializeEx()時決定客戶線程的類型的。如果以參數
COINIT_APARTMENTTHREADED調用,則會建立一個STA公寓,客戶線程包含在這個公寓裡。如果以參數
COINIT_MULTITHREADED調用,則建立一個MTA公寓,把線程加入到這個MTA中;如果進程內已經有了一個MTA,則不建立新的MTA,
只把線程加入到已有的MTA。注意每個線程都必須調用CoInitializeEx()才能使用COM組件。

  3、線程最重要的是同步問題。STA是通過視窗訊息佇列來解決這個問題的。當客戶線程以COINIT_APARTMENTTHREADED調用
CoInitializeEx()時,將為會該STA建立一個具有OleMainThreadWndClass視窗類別的隱含視窗。所有對在這個公寓中建立
的COM對象方法的調用都將都放到這個隱含視窗的訊息佇列中。所以每一個與STA相關聯的線程必須用GetMessage、
DispatchMessage或類似方法來指派視窗訊息。MTA內各線程可並行調用同一個組件對象的執行個體,從而不保證安全性,所以實現同步訪問的責任就
落在了組件身上。注意,STA的同步是公寓級的,就是說對公寓內不同組件的訪問都要放到同一個訊息佇列中,對一個執行個體的方法調用會影響對其他執行個體的調用,
所以並發程度很低。

  4、在不同公寓間傳遞介面指標必須要經過調度。這主要還是為了同步對組件的調用。通過CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream實現。很簡單。

  5、Single型組件很特殊,它只能在一個單一的線程中執行。首先要說明的是一個進程中第一個以
COINIT_APARTMENTTHREADED調用CoInitializeEx()的線程被稱作是主STA。每次用
CoCreateInstance()建立的Single型組件實際上都是建立在了這個主STA中,而不管是誰調用了
CoCreateInstance()這個函數。所有對這個Single組件方法的調用都必須要通過這個主STA。

  6、若STA建立STA型組件,是直接建立,直接調用。若STA建立MTA型組件,系統為組件建立一個MTA,STA通過代理訪問組件。若
STA建立Both型組件,是直接建立,直接調用。若MTA建立STA型組件,系統為組件建立一個STA,MTA通過代理訪問組件。若MTA建立MTA型
組件,是直接建立,直接調用。若MTA建立Both型組件,是直接建立,直接調用。可見如果客戶程式和組件都支援同樣的線程模式,那麼COM就允許客戶程
序直接調用對象,這樣將產生最佳效能。

  7、Both型組件已經很好了,無論是STA還是MTA都可以直接建立調用它。但跨公寓的調用仍然要經過代理。為了更進一步以獲得最佳效能,可
以使用自由線程調度器(FTM)。注意其它類型的組件也可以使用FTM,只是由Both使用FTM可獲得是最佳效果。FTM實現了介面IMarshal,
當調度那兩個調度介面指標的函數時,這兩個函數(見5)內部調用IMarshal內的相關函數,並判斷如果調度發生在一個進程內的公寓之間則直接返回介面
指標;如果調度發生在進程之間或者遠端電腦間,則調用標準的調度器,並返回指向代理對象的指標。所以可見使用FTM,即使是公寓之間也不用調度介面指標
了!!

  8、FTM雖然好,但使用FTM的組件必須遵守某些限制:使用FTM的對象不能直接擁有沒有實現FTM的對象的介面指標;使用FTM的對象不能擁有其他公寓對象代理的引用。

  9、全域介面表(GIT)。作用範圍是進程內。可以把介面指標存進表中,然後在別的公寓內把其取出,GIT自動執行公寓間的調度,所以很方便。
GIT是通過IGlobalInterfaceTable訪問的。通過建立CLSID為CLSID_StdGlobalInterfaceTable的對
象可調用它。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.