COM元件中的執行緒模式 (轉)
COM中的執行緒
lostall·com集中營
提及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內各執行緒可並行呼叫同一個元件物件的例項,從而不保證性,所以實現同步訪問的責任就落在了元件身上。注意,S他的同步是公寓級的,就是說對公寓內不同元件的訪問都要放到同一個訊息佇列中,對一個例項的方法呼叫會影響對其他例項的呼叫,所以併發程度很低。
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的物件可呼叫它。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989535/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- COM元件的多執行緒測試-Apartment模型 (轉)元件執行緒模型
- COM元件的多執行緒測試-Apartment模型(附錄) (轉)元件執行緒模型
- 泛說 "COM執行緒模型" (轉)執行緒模型
- 怪異的COM 執行緒模型執行緒模型
- Java執行緒:執行緒中斷Java執行緒
- 【轉】理解java執行緒的中斷(interrupt)Java執行緒
- Java程式中的多執行緒(1)(轉)Java執行緒
- Java程式中的多執行緒(2)(轉)Java執行緒
- 我的元件之執行緒類元件執行緒
- 執行緒 (轉)執行緒
- C#中的執行緒(三)多執行緒C#執行緒
- 從聯結器元件看Tomcat的執行緒模型——BIO模式元件Tomcat執行緒模型模式
- 從聯結器元件看Tomcat的執行緒模型——NIO模式元件Tomcat執行緒模型模式
- 多執行緒Reactor模式執行緒React模式
- ros 多執行緒模式ROS執行緒模式
- 執行緒安全的單例模式執行緒單例模式
- 執行緒同步的一些常見模式(1) (轉)執行緒模式
- 執行緒的中斷執行緒
- Java中的執行緒Java執行緒
- 多執行緒、重疊I/O的通訊埠元件 (轉)執行緒元件
- Java中CompletableFuture與虛擬執行緒比較Java執行緒
- Java多執行緒中的wait/notify通訊模式Java執行緒AI模式
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- Java執行緒中斷與終止執行緒執行Java執行緒
- 執行緒轉儲:命名你的執行緒和檢視系統(轉)執行緒
- JVM中的執行緒行為JVM執行緒
- java的執行緒、建立執行緒的 3 種方式、靜態代理模式、Lambda表示式簡化執行緒Java執行緒模式
- Java多執行緒20:多執行緒下的其他元件之CountDownLatch、Semaphore、ExchangerJava執行緒元件CountDownLatch
- COM套間和執行緒模型.執行緒模型
- 淺談執行緒池(中):獨立執行緒池的作用及IO執行緒池執行緒
- 執行緒中斷以及執行緒中斷引發的那些問題執行緒
- JAVA中執行緒的建立Java執行緒
- Java中的執行緒同步Java執行緒
- Java中的多執行緒Java執行緒
- Java執行緒的中斷Java執行緒
- JAVA中的執行緒世界Java執行緒
- 執行緒中的死鎖執行緒
- python中的執行緒Python執行緒