當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。
而乙個程序又是由多個執行緒所組成的。
執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器(棧指標、程式計數器等),但**區是共享的,即不同的執行緒可以執行同樣的函式。
多執行緒是指程式中包含多個執行流,即在乙個程式中可以同時執行多個不同的執行緒來執行不同的任務,也就是說允許單個程式建立多個並行執行的執行緒來完成各自的任務。
可以提高cpu的利用率。在多執行緒程式中,乙個執行緒必須等待的時候,cpu可以執行其它的執行緒而不是等待,這樣就大大提高了程式的效率。
執行緒也是程式,所以執行緒需要占用記憶體,執行緒越多占用記憶體也越多;
多執行緒需要協調和管理,所以需要cpu時間跟蹤執行緒;
執行緒之間對共享資源的訪問會相互影響,必須解決競用共享資源的問題;
執行緒太多會導致控制太複雜,最終可能造成很多bug;
多執行緒程式一般被用來在後台執行耗時的任務。主線程保持執行,並且工作執行緒做它的後台工作。對於windows forms程式來說,如果主線程試圖執行冗長的操作,鍵盤和滑鼠的操作會變的遲鈍,程式也會失去響應。由於這個原因,應該在工作執行緒中執行乙個耗時任務時新增乙個工作執行緒,即使在主線程上有乙個有好的提示「處理中…」,以防止工作無法繼續。這就避免了程式出現由作業系統提示的「沒有相應」,來誘使使用者強制結束程式的程序而導致錯誤。模式對話方塊還允許實現「取消」功能,允許繼續接收事件,而實際的任務已被工作執行緒完成。backgroundworker恰好可以輔助完成這一功能。
在沒有使用者介面的程式裡,比如說windows service, 多執行緒在當乙個任務有潛在的耗時,因為它在等待另台電腦的響應(比如乙個應用伺服器,資料庫伺服器,或者乙個客戶端)的實現特別有意義。用工作執行緒完成任務意味著主線程可以立即做其它的事情。
另乙個多執行緒的用途是在方法中完成乙個複雜的計算工作。這個方法會在多核的電腦上執行的更快,如果工作量被多個執行緒分開的話(使用environment.processorcount屬性來偵測處理晶元的數量)。
乙個c#程式稱為多執行緒的可以通過2種方式:明確地建立和執行多執行緒,或者使用.net framework的暗中使用了多執行緒的特性——比如backgroundworker類, 執行緒池,threading timer,遠端伺服器,或web services或asp.net程式。在後面的情況,人們別無選擇,必須使用多執行緒;乙個單執行緒的asp.net web server不是太酷,即使有這樣的事情;幸運的是,應用伺服器中多執行緒是相當普遍的;唯一值得關心的是提供適當鎖機制的靜態變數問題。
多執行緒也同樣會帶來缺點,最大的問題是它使程式變的過於複雜,擁有多執行緒本身並不複雜,複雜是的執行緒的互動作用,這帶來了無論是否互動是否是有意的,都會帶來較長的開發周期,以及帶來間歇性和非重複性的bugs。因此,要麼多執行緒的互動設計簡單一些,要麼就根本不使用多執行緒。除非你有強烈的重寫和除錯慾望。
當使用者頻繁地分配和切換執行緒時,多執行緒會帶來增加資源和cpu的開銷。在某些情況下,太多的i/o操作是非常棘手的,當只有乙個或兩個工作執行緒要比有眾多的執行緒在相同時間執行任務塊的多。稍後我們將實現生產者/耗費者 佇列,它提供了上述功能。
寫在多執行緒學習之前
打算在每個專題的學習之前,寫一篇隨筆,記錄下自己對該專題認知的1.0版,以後持續迭代。我學習多執行緒有以下兩個原因 一 多執行緒是高階開發人員必備的技能,我對多執行緒可以說仍是一知半解,停留在零散理論階段,未達到系統理論階段,更未達到實戰階段。工作中接觸到執行緒有三次,現在總結才發現都和定時任務有關...
傳統多執行緒之前如何共享資料
執行緒執行 不同,將共享資料封裝在另一物件中 運算元據的方法也在該物件完成 將這個物件逐一傳遞給各個runnable物件。本質 共享資料的物件作為引數傳入runnable物件 執行緒執行 不同,將runnable物件作為某乙個類的內部類,共享資料作為這個外部類的成員變數 運算元據的方法放在外部類 本...
多執行緒學習 簡單了解下
簡單了解下多工相關 多工不管是單核還是多核cpu,一單任務數量超過核數,os都會把每個任務輪流排程到每個核心上,os實現多執行緒和多程序往往都是通過時間片的形式執行的,即 每個任務 程序 執行緒 輪流執行,因為時間片切分的很小,以至於我們感覺多個任務在同時執行。實現多工方式 多程序模式,多執行緒模式...