COM線程模型1

COM中有下面一些使用規則。。
1,從一個線程調用Coinitliaze開始,到CoUninitliaze結束,這段區域稱爲套間(appartment)。
COM對象接口必須在套間內創建和使用。
2,接口指針不能跨套間使用,也就是說,在A套間創建的接口指針不能在B套間使用。
3,A套間創建的接口指針可以Marshal--》UnMarshal 在B套間生成一個新的接口指針,然後B 套間可以用它。
4,跨套間有幾種情況:跨線程,跨進程,遠程,都可以用Marshal機制 抽象的統一處理。
5,Marshal 機制簡單的說是在當前套間生成一個代理對象用來調用實際對象。

線程模型是一種數學模型,專門針對多線程編程而提供的算法,但也僅是算法,不是實現。本文講解COM提出的各個類型的線程模型,再說明COM運行時期庫是如何實現它們的,就像說明Windows是如何實現線程這個數學模型的一樣,最後指明一下跨套間調用和各種類型套間編寫的要求以幫助理解。希望讀者對於Windows操作系統的線程這個概念相當熟悉,對何謂“線程安全的”亦非常瞭解。

  COM線程模型

  COM提供的線程模型共有三種:Single-Threaded Apartment(STA 單線程套間)、Multithreaded Apartment(MTA 多線程套間)和Neutral Apartment/Thread Neutral Apartment/Neutral Threaded Apartment(NA/TNA/NTA 中立線程套間,由COM+提供)。雖然它們的名字都含有套間這個詞,這只是COM運行時期庫(注意,不是COM規範,以下簡稱COM)使用套間技術來實現前面的三種線程模型,應注意套間和線程模型不是同一個概念。COM提供的套間共有三種,分別一一對應。而線程模型的存在就是線程規則的不同導致的,而所謂的線程規則就只有兩個:代碼是線程安全的或不安全的,即代碼訪問公共數據時會或不會發生訪問衝突。由於線程模型只是個模型,概念上的,因此可以違背它,不過就不能獲得COM提供的自動同步調用及兼容等好處了。

  STA 一個對象只能由一個線程訪問(通過對象的接口指針調用其方法),其他線程不得訪問這個對象,因此對於這個對象的所有調用都是同步了的,對象的狀態(也就是對象的成員變量的值)肯定是正確變化的,不會出現線程訪問衝突而導致對象狀態錯誤。其他線程要訪問這個對象,必須等待,直到那個唯一的線程空閒時才能調用對象。注意:這只是要求、希望、協議,實際是否做到是由COM決定的。如上所說,這個模型很像Windows提供的窗口消息運行機制,因此這個線程模型非常適合於擁有界面的組件,像ActiveX控件、OLE文檔服務器等,都應該使用STA的套間。

  MTA 一個對象可以被多個線程訪問,即這個對象的代碼在自己的方法中實現了線程保護,保證可以正確改變自己的狀態。這對於作爲業務邏輯組件或幹後臺服務的組件非常適合。因爲作爲一個分佈式的服務器,同一時間可能有幾千條服務請求到達,如果排隊進行調用,那麼將是不能想像的。注意:這也只是一個要求、希望、協議而已。


  NA 一個對象可以被任何線程訪問,與MTA不同的是任何線程,而且當跨套間訪問時(後面說明),它的調用費用(耗費的CPU時間及資源)要少得多。這準確的說都已經不能算是線程模型了,它是結合套間的具體實現而提出的要求,它和MTA不同的是COM的實現方式而已。

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