標籤:put size 寫法 上下 int ntb 問題 join 邏輯
通過將一個任務劃分成多個任務分別在獨立的線程執行可以更有效地利用處理器資源並節省時間。但如果不合理地使用多線程,反而會帶來種種問題並拖慢運行速度。
一 線程基礎
a)線程與多任務
一個線程就是一個處理單元,多任務時多個線程會同時執行。多任務時會涉及到任務間的合作與優先順序的問題。Windows NT核心的作業系統使用搶佔多任務處理機制(preemptivemultitasking),系統會為每個線程劃分出確定的執行時間(時間片),然後線程在給定的時間片內輪流執行。
在單核處理器上使用多線程時,線程只是被輪流執行,但給人的感覺好像是在同時執行;如果是在多核或者多個處理器上運行多線程,線程會真正同時運行。
b)環境切換(Context Switching)
對於多線程來說,環境切換是不可或缺的功能。當一個時間片被用完時處理器會發出中斷訊號,處理器將當前線程相關的內容儲存到棧上,然後將下一個線程的相關內容從棧上讀取到CONTEXT資料結構中,如果時間片用盡,又會切換CONTEXT中裝載的線程。
c)多線程的使用
一個簡單的多線程使用樣本如下:
?
ThreadStartworker = new ThreadStart(WorkerThreadMethod);這樣的寫法在委託一章接觸過,xvarName=new x (methodName)這樣的形式表示初始化了一個x類型的委託,並指向methodName方法。
在執行個體化Thread時,必須傳遞ThreadStart類型的委託作為參數。調用Thread.Start方法後,ThreadStart指向的方法就會在另一個線程被執行。
二 System.Threading.Thread類
a)AppDomain(應用程式定義域)
AppDomain與win32進程有不少類似的地方,但在win32中,一個線程被限制在特定的進程中,不同進程間線程無法互動。而AppDomain中的線程可以跨域通訊,或者調用其它AppDomain中的方法。所以,AppDomain相當於是在物理進程中的邏輯進程。
b)有兩種方式可以拿到線程執行個體,一種是使用關鍵字new,另一種是使用Thread.CurrentThread取得正在執行的線程。可以使用Thread.Sleep方法來讓線程掛起指定的時間,這個方法是靜態。如果為Thread.Sleep方法傳遞的參數為0,當前線程會主動釋放尚未用完的時間片;如果為其傳遞Timeout.Infinite(值為-1的常量),那麼當前線程會被無限期地暫停,直到有另一個線程對其執行個體調用Thread.Interrupt方法。Thread.Suspend方法也可以讓線程掛起,但不是靜態方法,要由另一個線程調用,與之配合的方法還有Thread.Resume。
c)Thread.Abort方法可以銷毀線程,系統內部通過拋出ThreadAbortException異常來終止線程。ThreadAbortException比較特殊,是無法被捕獲的。Abort後,線程不會立即停止,會等到將當前工作完成,達到”safe point”後才退出。在多線程編程中,為了可靠地知道某個線程是否已終止,可以使用Thread.Join方法,這個方法直到線程被銷毀後才返回。另外一旦線程被銷毀,就無法被重新啟動的。
學習資料:Inside C# by Tom Archer
《Inside C#》筆記(十三) 多線程 上