目錄
一、什麼是程序
二、什麼是線程
三、多線程處理的優點
四、多線程與單線程的差別
五、主線程與子線程之間的關系
在軟體層面,多線程就是能同時從多個路線同時執行處理。從軟體的角度來說,線程可以看作是同時的。即便在單核處理器的電腦上也能實作多線程。但是多個線程畢竟是要在CPU上跑的,一定會有一個先後,是以這就涉及到了CPU的排程(時間片輪轉)問題。
當一個程式開始運作時,它就是一個程序,程序包括運作中的程式和程式所使用到的記憶體和系統資源。而一個程序又是由多個線程所組成的。
線程是程式中的一個執行流,每個線程都有自己的專有寄存器(棧指針、程式計數器等),但代碼區是共享的,即不同的線程可以執行同樣的函數。
多線程:多線程是指程式中包含多個執行流,即在一個程式中可以同時運作多個不同的線程來執行不同的任務,也就是說允許單個程式建立多個并行執行的線程來完成各自的任務。
多線程的好處:可以提高CPU的使用率。在多線程程式中,一個線程必須等待的時候,CPU可以運作其它的線程而不是等待,這樣就大大提高了程式的效率。
多線程的不利方面:
線程也是程式,是以線程需要占用記憶體,線程越多占用記憶體也越多;
多線程需要協調和管理,是以需要CPU時間跟蹤線程;
線程之間對共享資源的通路會互相影響,必須解決競用共享資源的問題;
線程太多會導緻控制太複雜,最終可能造成很多Bug;
多線程程式設計的目的,就是"最大限度地利用CPU資源",當某一線程的處理不需要占用CPU而隻和I/O,OEMBIOS等資源打交道時,讓需要占用CPU資源的其它線程有機會獲得CPU資源。
每個程式執行時都會産生一個程序,而每一個程序至少要有一個主線程。這個線程其實是程序執行的一條線索,除了主線程外你還可以給程序增加其它的線程,也即增加其它的執行線索,由此在某種程度上可以看成是給一個應用程式增加了多任務功能。
當程式運作後,您可以根據各種條件挂起或運作這些線程,尤其在多CPU的環境中,這些線程是并發運作的。
多線程就是在一個程序内有多個線程。進而使一個應用程式有了多任務的功能。多程序技術也可以實作這一點,但是建立程序的高消耗(每個程序都有獨立的資料和代碼空間),程序之間通信的不友善(消息機制),程序切換的時間太長,這些導緻了多線程的提出,對于單CPU來說(沒有開啟超線程),在同一時間隻能執行一個線程,是以如果想實作多任務,那麼就隻能每個程序或線程獲得一個時間片,在某個時間片内,隻能一個線程執行,然後按照某種政策換其他線程執行。
由于時間片很短,這樣給使用者的感覺是同時有好多線程在執行。但是線程切換是有代價的,是以如果采用多程序,那麼就需要将線程所隸屬的該程序所需要的記憶體進行切換,這時間代價是很多的。
而線程切換代價就很少,線程是可以共享記憶體的。是以采用多線程在切換上花費的比多程序少得多。但是,線程切換還是需要時間消耗的,是以采用一個擁有兩個線程的程序執行所需要的時間比一個線程的程序執行兩次所需要的時間要多一些。即采用多線程不會提高程式的執行速度,反而會降低速度,但是對于使用者來說,可以減少使用者的響應時間。
上述結果隻是針對單CPU,如果對于多CPU或者CPU采用超線程技術的話,采用多線程技術還是會提高程式的執行速度的。因為單線程隻會映射到一個CPU上,而多線程會映射到多個CPU上,超線程技術本質是多線程硬體化,是以也會加快程式的執行速度。
優點:
同步應用程式的開發比較容易,但由于需要在上一個任務完成後才能開始新的任務,是以其效率通常比多線程應用程式低。如果完成同步任務所用的時間比預計時間長,應用程式可能會不響應。多線程處理可以同時運作多個過程。例如,文字處理器應用程式在您處理文檔的同時,可以檢查拼寫(作為單獨的任務)。由于多線程應用程式将程式劃分成獨立的任務,是以可以在以下方面顯著提高性能。
多線程技術使程式的響應速度更快,因為使用者界面可以在進行其他工作的同時一直處于活動狀态。
目前沒有進行處理的任務可以将處理器時間讓給其他任務。
占用大量處理時間的任務可以定期将處理器時間讓給其他任務。
可以随時停止任務。
可以分别設定各個任務的優先級以優化性能。
是否需要建立多線程應用程式取決于多個因素。在以下情況下,最适合采用多線程處理:
耗時或大量占用處理器的任務阻塞使用者界面操作。
各個任務必須等待外部資源(如遠端檔案或 INTERNET 連接配接)。
在單核的前提下,假如有10個任務。如果用單線程,那麼我可以依次做這10個任務-----做完地一個做第二個做完第二個做第三個......而如果用多線程的話,等效于有一個任務隊列,我run了這10個任務線程等于把這10個線程都插入了這個任務隊列中,然後這10個任務去搶CPU。感覺上有點異步的味道:我不必等一個任務完成了才能執行第二個、我不必等這10個任務都完成了才能繼續往下走。
多線程的産生并不是因為發明了多核CPU甚至現在有多個CPU+多核的硬體,也不是因為多線程CPU運作效率比單線程高。單從CPU的運作效率上考慮,單任務程序及單線程效率是最高的,因為CPU沒有任何程序及線程的切換開銷。
多線程的出現主要為了解決IO裝置的讀寫速度往往比CPU的處理速度慢造成的單線程程式運作阻塞問題,一個極端的例子就是如果你需要使用者在鍵盤上輸入一個資料,當使用者沒有輸入前,單線程程式就阻塞了,多線程程式就可以放個音樂或繼續幹一些程式中除了鍵盤輸入外的工作,是以,多線程能提高因程式由于等待某個資源阻塞時其他資源的使用率(是使用率不是效率)。
是以多線程與單線程的最大差別,多線程程式能在等待某個IO操作時,繼續完成非這個IO的其他工作,有利于提高完成整個任務的效果和速度。此外,多線程程式與單線程程式對程式設計也有不同的流程和結構,多線程需要考慮對靜态變量等資源的操作互鎖及程式執行的同步問題。
生活舉例:
你早上上班,正要打卡的時候,手機響了,你如果先接了電話,等接完了,在打卡,就是單線程。如果你一手接電話,一手打卡。就是多線程。兩件事的結果是一樣的,你接了電話且打了卡。
一個應用程式就對應一個程序,一個程序可有一個或多個線程,而一般有一個主線程。
主線程與子線程之間的關系:
預設情況,在新開啟一個子線程的時候,他是前台線程,隻有,将線程的IsBackground屬性設為true;他才是背景線程。
當子線程是前台線程,則主線程結束并不影響其他線程的執行,隻有所有前台線程都結束,程式結束。
當子線程是背景線程,則主線程的結束,會導緻子線程的強迫結束。
(個人了解,這樣設計的原因:因為背景線程一般做的都是需要花費大量時間的工作,如果不這樣設計,主線程已經結束,而背景工作線程還在繼續,第一有可能使程式陷入死循環,第二主線程已經結束,背景線程即時執行完成也已經沒有什麼實際的意義)