STA和MTA執行緒模式的區別

2021-06-09 13:10:15 字數 1475 閱讀 1946

sta和mta執行緒模式的區別(摘錄)

by  饅頭販子 發表於 2010-5-20 14:36:00 

sta:   single-thread   apartment,   中文叫單執行緒套間。就是在com庫初始化的時候建立乙個記憶體結構,然後讓它和呼叫coinitialize的執行緒相關聯。這個記憶體結構針對每個執行緒都會有乙個。支援sta的com物件只能在建立它的執行緒裡被使用,其它執行緒如果再建立它就會失敗。   

mta:   mutil-thread   apartment,中文叫多執行緒套間。com庫在程序中建立乙個記憶體結構,這個記憶體結構在整個程序中只能有乙個,然後讓它和呼叫coinitializeex的執行緒相關聯。支援mta的com物件可以在任意執行緒裡被使用。多有針對它的呼叫都會被封裝成為訊息。

其實sta和mta是com規定的一套執行緒模型,用於保障多執行緒情況下你的元件**的同步。比如說有乙個com物件它內部有乙個靜態變數   ghello,那麼這個物件無論生成多少例項對於ghello在記憶體中只能有乙份,那麼如果有兩個不同的例項在兩個執行緒裡面同時去讀寫它,就有可能出錯,所以就要就要有種機制進行同步保護,sta或者mta就是這種機制。

程序相對於乙個小城鎮,執行緒相當於這個城鎮裡的居民,sta(單執行緒套間)相當於居民房,是私有的,mta(多執行緒套間)相當於旅館,是公用的,com物件相當於居民房或旅館裡的物品.接下去就好理解了,乙個小城鎮(程序)裡可以有很多很多的(居民)執行緒,這個城鎮(程序)只有一間旅館(mta),但可以有很多很多的居民房(sta).只有居民(執行緒)進入了房間(居民房或旅館,sta或mta)以後才能使用該房間裡的物品(com物件),居民房(sta)裡的物品(com物件)只能供這間房子的主人(建立該sta的執行緒)使用,其它居民(執行緒)不能訪問.同樣,只有入住到旅館(mta)裡的居民(執行緒,可以有多個)才可以訪問到旅館(mta)裡的物品(com物件),但因為是公用的,所以要合理的分配(同步)才能不會產生混亂.

執行緒的使用區別:

我們應該僅僅在訪問sta-based 的com元件時才使用sta執行緒模式。可以在登錄檔的hkey_classes_root\clsid\ \inprocserver32 下檢視到該com的執行緒模式。如果該值是apartment,則說明該com只能以sta模式執行。其他的值有free(mta),both(sta+mta),single(只能在乙個單一的執行緒中執行)。

其他情況下,我們應該使用mta的執行緒,雖然需要我們費心執行緒間資源的同步問題。

示例:我現在想在乙個windows form的程式中實現從某個word文件複製並儲存的方案。

具體是:開啟word文件,將資訊複製到貼上板中,然後從貼上板中取得資訊,再儲存到本地目錄中。

另外一點不明白,我監視任務管理器發現,我在執行thread t = new thread(new theardstart(copyimages);t.apartment = apartmentstate.sta; t.start();之後該程式的程序中線程數從3個增加到6個,如果建立的是mta的執行緒則只增加1。我的理解是sta執行緒為需要維護內部隱藏的視窗類和訊息佇列而增加的。

WiFi的STA和AP模式指什麼?

wifi的sta和ap模式指什麼?1 ap,也就是無線接入點,是乙個無線網路的建立者,是網路的中心節點。一般家庭或辦公室使用的無線路由器就乙個ap。2 sta站點,每乙個連線到無線網路中的終端 如膝上型電腦 pda及其它可以聯網的使用者裝置 都可稱為乙個站點。站點 sta,station 在無線區域...

主線程和子執行緒的區別

每個執行緒都有乙個唯一標示符,來區分執行緒中的主次關係的說法。執行緒唯一標示符 thread.currentthread.managedthreadid public delegate void dele public partial class form1 form thread thread p...

前台執行緒和後台執行緒的區別

net的公用語言執行時 common language runtime,clr 能區分兩種不同型別的執行緒 前台執行緒和後台執行緒。這兩者的區別就是 應用程式必須執行完所有的前台執行緒才可以退出 而對於後台執行緒,應用程式則可以不考慮其是否已經執行完畢而直接退出,所有的後台執行緒在應用程式退出時都會...