1. 綫程的概念

我們知道,進程在各自獨立的地址空間中運行,進程之間共享數據需要用mmap或者進程間通信機制,本節我們學習如何在一個進程的地址空間中執行多個綫程。有些情況需要在一個進程中同時執行多個控制流程,這時候綫程就派上了用場,比如實現一個圖形界面的下載軟件,一方面需要和用戶交互,等待和處理用戶的滑鼠鍵盤事件,另一方面又需要同時下載多個檔案,等待和處理從多個網絡主機發來的數據,這些任務都需要一個“等待-處理”的循環,可以用多綫程實現,一個綫程專門負責與用戶交互,另外幾個綫程每個綫程負責和一個網絡主機通信。

以前我們講過,main函數和信號處理函數是同一個進程地址空間中的多個控制流程,多綫程也是如此,但是比信號處理函數更加靈活,信號處理函數的控制流程只是在信號遞達時產生,在處理完信號之後就結束,而多綫程的控制流程可以長期並存,操作系統會在各綫程之間調度和切換,就像在多個進程之間調度和切換一樣。由於同一進程的多個綫程共享同一地址空間,因此Text Segment、Data Segment都是共享的,如果定義一個函數,在各綫程中都可以調用,如果定義一個全局變數,在各綫程中都可以訪問到,除此之外,各綫程還共享以下進程資源和環境:

但有些資源是每個綫程各有一份的:

我們將要學習的綫程庫函數是由POSIX標準定義的,稱為POSIX thread或者pthread。在Linux上線程函數位于libpthread共享庫中,因此在編譯時要加上-lpthread選項。