任務,過程,和線程(3)

來源:互聯網
上載者:User
過程 單元線程

如果一個組件被標記為單元線程,那麼每個可執行檔方法都將在一個和組件相聯絡的線程上運行。之所以成為單元線程是因為,每個新產生的組件執行個體都有一個相應的線程單元,每個正在啟動並執行組件都有它自己的線程。Apartment 執行緒元件要比單執行緒元件要好,因為多個組件可以在各自的單元中同時運行方法。

自由線程

一個自由執行緒元件是一個支援多執行緒 Apartment的多執行緒元件。這意味著多個方法調用可同時運行,因為每個調用都有自己的運行線程。這能使你的組件運行快得多,但也有一些缺點。運行在同一單元中的單元組件可以在單元中直接調用其他組件的方法,這是一個非常快的操作。但是,自由執行緒元件必須從一個單元向另一個單元調用。為了實現這一操作,WIN32產生了一個代理,用來通過單元界線。這對於每個需要的功能調用來說就產生了系統開銷,從而減低了系統的速度。每一個訪問自由組件的調用都有一個相應的代理。既然代理調用比直接調用慢,那麼自然會有效能方面的降低。

關於自由執行緒元件另一個需要注意的是:他們不是真正自由的。如果你建立了一個自由執行緒元件。你仍必須確保組件中的線程完全同步。這不是一件容易的事。只是簡單地把你的組件標記為是自由線程的,並不能使你的組件支援多線程,你仍要去做使你的組件自由線程化的工作。如果你不做這個工作,你的共用資料可能被破壞。這裡說明一下為什麼:讓我們假定你有一個方法計算某個數然後把它寫到某個變數中。此方法被傳入一個初始值例如是4,在隨後的計算中這個變數的值增長為5。在方法結束時這個最後的值被寫入到變數中。如果一次只有一個計算過程的話,所有這些會工作得很好。然而,當資料正在被改變時,另一個線程試圖訪問它,那麼重新得到的資料就有可能是錯誤的。

為了修正這一錯誤,開發人員為對象提供了線程同步。線程同步是在正在運行你想保護的某一其他代碼時啟動並執行代碼。作業系統並不先佔這個代碼,直到獲得一個可以中斷的訊號。如果你想瞭解更多的有關線程同步對象的詳細內容,你不應該閱讀Geek Speak column!不,我的意思是,“注意看一下本文後面列出的參考閱讀文獻”。



圖二,共用資料被多線程訪問搞亂了

 

組合線程

讀到這,你也許會想既然每種形式的線程都有自己的優點和缺點,為什麼不把不同的線程模式結合起來使用呢?組合線程模式也許符合你的要求。一個被標記為組合線程的組件既有Apartment 執行緒元件的特性又有自由執行緒元件的特性。當一個組件被標記為組合線程時,這個組件將總是在和產生它的對象所在單元相同的單元中建立。如果組件是被一個標記為單線程的對象建立的,那麼這個組件的行為將和一個Apartment 執行緒元件一樣,並且它將線上程單元中建立。這就意味著,組件和建立它的對象之間的調用,不需要一個為通訊提供的代理調用。

如果新組件是被自由執行緒元件建立的,那麼這個組件將表現得像一個自由執行緒元件,但是它將在同一單元中運行,因此新組件能夠直接存取建立它的對象(既不需代理調用)。切記,如果你打算把你的組件標記為組合線程,你必須提供線程同步保護你的線程資料。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。