多線程的基本概念


本文最新版本已遷移至:http://thinkinside.tk/2012/02/23/multi_thread.html

多線程編程必須理解的一些基本概念,適用於所有編程語言。內容:
並發式編程
多任務操作系統
多線程vs多進程
線程安全
線程的生命周期
線程的類型

並發式編程

不同的編程范式對軟件有不同的視角。並發式編程將軟件看做任務和資源的組合——任務之間競爭和共享資源,當資源滿足時執行任務,否則等待資源。
並發式編程使得軟件易於理解和重用,在某些場景能夠極大提高性能。

多任務操作系統

要實現並發,首先需要操作系統的支持。現在的操作系統大部分都是多任務操作系統,可以“同時”執行多個任務。
多任務可以在進程或線程的層面執行。
進程是指一個內存中運行的應用程序,每個進程都有自己獨立的一塊內存空間。多任務操作系統可以“並發”執行這些進程。
線程是指進程中亂序、多次執行的代碼塊,多個線程可以“同時”運行,所以認為多個線程是“並發”的。多線程的目的是為了最大限度的利用CPU資源。比如一個JVM進程中,所有的程序代碼都以線程的方式運行。
這里面的“同時”、“並發”只是一種宏觀上的感受,實際上從微觀層面看只是進程/線程的輪換執行,只不過切換的時間非常短,所以產生了“並行”的感覺。

多線程vs多進程

操作系統會為每個進程分配不同的內存塊,而多個線程共享進程的內存塊。這帶來最直接的不同就是創建線程的開銷遠小於創建進程的開銷。
同時,由於內存塊不同,所以進程之間的通信相對困難。需要采用pipe/named pipe,signal, message queue, shared memory,socket等手段;而線程間的通信簡單快速,就是共享進程內的全局變量。
但是,進程的調度由操作系統負責,線程的調度就需要我們自己來考慮,避免死鎖,飢餓,活鎖,資源枯竭等情況的發生,這會增加一定的復雜度。而且,由於線程之間共享內存,我們還需要考慮線程安全性的問題。

線程安全

以為線程間共享進程中的全局變量,所以當其他線程改變了共享的變量時,可能會對本線程產生影響。所謂線程安全的約束是指一個函數被多個並發線程反復調用時,要一直產生正確的結果。要保證線程安全,主要是通過加鎖的方式保證共享變量的正確訪問。
比線程安全更嚴格的約束是"可重入性",即函數在一個線程內執行的過程中被暫停,接下來又在另一個線程內被調用,之后在返回原線程繼續執行。在整個過程中都能保證正確執行。保證可重入性,通常通過制作全局變量的本地拷貝來實現。

線程的生命周期

所謂的xx生命周期,其實就是某對象的包含產生和銷毀的一張狀態圖。線程的生命周期如下圖所示:

各狀態的說明如下:
  1. New新建。新創建的線程經過初始化后,進入Runnable狀態。
  2. Runnable就緒。等待線程調度。調度后進入運行狀態。
  3. Running運行。
  4. Blocked阻塞。暫停運行,解除阻塞后進入Runnable狀態重新等待調度。
  5. Dead消亡。線程方法執行完畢返回或者異常終止。

 

可能有3種情況從Running進入Blocked:
  • 同步:線程中獲取同步鎖,但是資源已經被其他線程鎖定時,進入Locked狀態,直到該資源可獲取(獲取的順序由Lock隊列控制)
  • 睡眠:線程運行sleep()或join()方法后,線程進入Sleeping狀態。區別在於sleep等待固定的時間,而join是等待子線程執行完。當然join也可以指定一個“超時時間”。從語義上來說,如果兩個線程a,b, 在a中調用b.join(),相當於合並(join)成一個線程。最常見的情況是在主線程中join所有的子線程。
  • 等待:線程中執行wait()方法后,線程進入Waiting狀態,等待其他線程的通知(notify)。

線程的類型

  • 主線程:當一個程序啟動時,就有一個進程被操作系統(OS)創建,與此同時一個線程也立刻運行,該線程通常叫做程序的主線程(Main Thread)。每個進程至少都有一個主線程,主線程通常最后關閉。
  • 子線程:在程序中創建的其他線程,相對於主線程來說就是這個主線程的子線程。
  • 守護線程:daemon thread,對線程的一種標識。守護線程為其他線程提供服務,如JVM的垃圾回收線程。當剩下的全是守護線程時,進程退出。
  • 前台線程:相對於守護線程的其他線程稱為前台線程。

本文介紹關於多線程的基本概念,接下來會用實例講解python的多線程編程。  

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM