線程
我們知道 ,進程在各自獨立的地址空間中運行,進程之間共享數據需要用mmap或者進程間通信機制,本節我們學習如何在一個進程的地址空間中執行多個線程。有些情況需要在一個進程中同時執行多個控制流程,這時候線程就派上了用場,比如實現一個圖形界面的下載軟件, 一方面需要和用戶交互,等待和處理用戶的鼠標鍵盤事件,另一方面又需要同時下載多個文件, 等待和處理從多個 網絡主機發來的數據,這些任務都需要一個“等待-處理”的循環,可以用多線程實現,一個線程專門 負責與用戶交互,另外幾個線程每個線程負責和一個網絡主機通信。
以前我們講過,main函數和信號處理函數是同一個進程地址空間中的多個控制流程,多線程也是如此,但是比信號處理函數更加靈活,信號處理函數的控制流程只是在信號遞達時產生,在處理完信號之後就結束,而多線程的控制流程可以長期並存,操作系統會在各線程之間調度和切換,就像在多個進程之間調度和切換一樣
由於同一進程的多個線程共享同一地址空間,因 此Text Segment、Data Segment都是共享的,如果定義一個函數,在各線程中都可以調用,如果定義一個全局變量,在各線程中都可以訪問到,除此之外,各線程還共享以下進程資源和環 境:
1. 文件描述符表
2. 每種信號的處理方式(SIG_IGN、SIG_DFL或者自定義的信號處理函數)
3. 當前工作目錄
4. 用戶id和組id
但是線程也有私有的資源:
1. 線程id
2. 上下文,包括各種寄存器的值、程序計數器和棧指針
3. 棧空間
4. errno變量
5. 信號屏蔽字
6. 調度優先級
在Linux 上線程函數位於libpthread共享庫中,因此在編譯時要加上-lpthread選項。