組件的多線程特性

 

1. 組件的多線程特性::
在設計COM組件的時候,需要考慮它在多線程環境中運行的情況。因爲組件客戶可能在多個線程中調用這個COM對象提供的功能。
Win32平臺,具有兩種線程,一種爲UI線程,UI線程擁有自己的消息循環,可以包含窗口,通過消息循環向窗口分發消息。另一種爲輔助線程,也稱工作(者)線程,沒有消息循環,不能處理消息,一般用作後臺處理。COM中與UI對象的是套間線程(apartment thread),它的主函數中包含消息循環,與輔助線程對應的是自由線程(free thread),它的主函數中不包含消息循環。
COM規範並沒有定義特有的線程模型,所以需要COM組件的實現者來保護COM對象的相關資源,即進行同步處理。
2. 組件的線程模型:
       組件的線程模型有如下5類:
單線程(Single)
單元(Apartment)
兩者(Both)
自由(Free)
中性(僅實用於win2000)
       這裏要重點講解下套間的概念,套間是一個抽象的概念,它是在初始化COM庫的時候指定和創建的。它的存在其實是爲了更加詳細的描述組件和組件之間以及組件和組件客戶之間,在多線程環境中的交互規範。從而決定這些組件之間或者組件和客戶之間的調用是否需要列集和散集。
       套間分爲STA(單線程套間)和MTA(多線程套間),一個STA只能容納一個COM組件對象。一個線程可以創建多個STA一個MTA是多個自由線程結合起來的自由線程組,合併起來稱爲MTA。所以,一個程序可以擁有多個STA,一個MTA.
       在創建一個程序的時候,默認就創建了一個主線程,用戶也可以另行創建輔助線程。當要調用組件功能的時候,首先需要初始化COM庫(通過CoInitialize或者CoInitializeEx初始化,並指定一個套間線程模型),初始化完畢後,就在這個線程環境中創建了一個套間(相當於劃分了一塊地盤)。然後通過CoCreateInstance創建組件接口指針(其實隱含的創建了一個組件對象),COM庫判斷此組件的線程模型是否和初始化COM庫時指定的套間線程模型一樣,如果一樣,就直接將該組件對象放入自己的地盤。如果不一樣,就要將該COM對象放入另外的套間以容納之。
    組件對象的線程模型就是上面的5類:
1. 單線程模型:此模型指定該COM對象只能在應用程序的主線程中創建。因爲主線程擁有消息循環,所以自動實現了同步處理。
2. 單元模型:此模型指定COM對象只能在STA(單線程套間)中創建和運行。因爲該套間只容納一個COM組件,跨套間之間的調用,COM對接口的調用通過列集和散集實現同步處理。
3. 兩者模型:此模型表示該COM對象可以在STA或者MTA(多線程套間)中運行。組件客戶可以直接獲取該COM組件的接口指針。但是用戶需要編寫同步代碼。
4. 自由模型;此模型表示該COM對象在MTA套間中創建,用戶需要編寫同步代碼。
5. 中性:
在套間之內的調用是直接進行的,效率最高,但是需要編寫同步代碼。跨套間之間的調用是需要列集和散集處理的,雖然不需要編寫同步代碼,但是會影響性能,在設計程序的時候,要慎重考慮組件的線程模型。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章