元件的多執行緒特性

2021-04-12 17:48:14 字數 1581 閱讀 5679

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. 中性:

在套間之內的呼叫是直接進行的,效率最高,但是需要編寫同步**。跨套間之間的呼叫是需要列集和散集處理的,雖然不需要編寫同步**,但是會影響效能,在設計程式的時候,要慎重考慮元件的執行緒模型。

多執行緒1 50的特性

jdk1.5以後將同步和鎖封裝成了物件。並將操作鎖的隱式方法定義到了該物件中。將隱式動作變成了顯示動作 建立乙個鎖物件 lock lock new reentrantlock 通過已有的鎖獲取該鎖上的監視器物件 condition con lock.newcondition 乙個鎖上面可以掛多個 物...

多執行緒的三大特性

多執行緒的三大特性 原子性 是指乙個操作是不可中斷的。即使是多個執行緒一起執行的時候,乙個操作一旦開始,就不會被其他執行緒干擾。比如,對於乙個靜態全域性變數int i,兩個執行緒同時對它賦值,執行緒a給他賦值為1,執行緒b給他賦值為 1。那麼不管這兩個執行緒 以何種方式。何種步調工作,i的值要麼是1...

多執行緒的三種特性

是指乙個操作是不可中斷的。即使是多個執行緒一起執行的時候,乙個操作一旦開始,就不會被其他執行緒干擾。比如,對於乙個靜態全域性變數int i,兩個執行緒同時對它賦值,執行緒a給他賦值為1,執行緒b給他賦值為 1。那麼不管這兩個執行緒 以何種方式。何種步調工作,i的值要麼是1,要麼是 1.執行緒a和執行...