Linux學習--線程概念

線程

我們知道 ,進程在各自獨立的地址空間中運行,進程之間共享數據需要用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選項。  

發佈了109 篇原創文章 · 獲贊 424 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章