執行緒與並行

執行緒(thread of execution)

/ thread (rhymes with 'red') /

當一個程式執行時,必須有某樣東西記著它走到哪了:正在執行哪一行程式碼、以及它身處的那串函式呼叫鏈。執行緒(thread)正是這個東西——一條獨立的控制流,沿著指令一路前進。這個名字是個好比喻:它就是你能在程式碼中一路跟著走的一條「線」,是 CPU 一條接一條執行陳述式時所走的路徑。簡單的程式只有一條執行緒,從 main() 開始,沿著呼叫一路往下穿。

具體來說,執行緒是作業系統排上 CPU 的最小單位。每條執行緒有自己的程式計數器(標記下一條要跑的指令)以及自己的堆疊(存放它那些函式呼叫的區域變數與返回位址的記憶體區域)。程式可以要求作業系統建立額外的執行緒,於是好幾條執行緒在同一個程式裡跑,各有自己當前的位置和自己的堆疊,但其餘部分共享這個程式的記憶體。作業系統輪流把 CPU 分給每條執行緒,在它們之間切換,讓它們全都往前推進。

執行緒為何存在:它讓一個程式同時做好幾件事——在下載進行時保持使用者介面有回應、同時服務許多客戶、或把一個大計算切分到多個 CPU 核心上。這份力量伴隨著本欄位將整篇談論的代價:因為同一程式裡的執行緒共享記憶體,兩條執行緒同時碰同一筆資料就可能把它弄壞。執行緒既便宜又強大,但「共享狀態的執行緒」正是系統程式設計中最難纏錯誤的源頭。

文字編輯器常至少跑兩條執行緒:一條盯著鍵盤並重繪畫面,讓打字感覺即時;另一條則默默把你的檔案自動存到磁碟。它們在同一個程式裡跑,共享記憶體中的文件,卻在程式碼裡走兩條各自獨立的路。

兩條執行緒,一個程式:各自的位置與堆疊,共享的記憶體。

執行緒不是另一個程式,也不是一個 CPU 核心。它是一條由作業系統排程的控制流;你可以有遠多於核心數的執行緒,作業系統再把它們以時間切片排到現有的核心上。

又称
threadexecution thread執行緒線程