一、線程概念
1、引入
我們知道,進程在各自獨立的地址空間中運行,進程之間共享數(shù)據(jù)需要用mmap或者進程間通信機制,本篇我們將學(xué)習(xí)如何在一個進程的地址空間中執(zhí)行多個線程。有些情況需要在一個進程中同時執(zhí)行多個控制流程,這時候線程就派上了用場,比如實現(xiàn)一個圖形界面的下載軟件, 一方面需要和用戶交互,等待和處理用戶的鼠標(biāo)鍵盤事件,另一方面又需要同時下載多個文件, 等待和處理從多個網(wǎng)絡(luò)主機發(fā)來的數(shù)據(jù),這些任務(wù)都需要一個“等待-處理”的循環(huán),可以用多線程實現(xiàn),一個線程專門負責(zé)與用戶交互,另外一個線程負責(zé)和一個網(wǎng)絡(luò)主機通信。
2、什么叫線程
在一個程序里的多個執(zhí)行路線就叫做線程。更準(zhǔn)確的定義是:線程是“一個進程內(nèi)部的一個控制序列”。典型的unix進程可以看成只有一個控制線程:一個進程在同一時刻只做一件事情。有了多個控制線程以后,在程序設(shè)計時可以把進程設(shè)計成在同一時刻能夠做不止一件事,每個線程處理各只獨立的任務(wù)。線程可以看作是輕量級進程,它是操作系統(tǒng)調(diào)度的基本單位。main函數(shù)和信號處理函數(shù)是同一個進程地址空間中的多個控制流程,多線程也是如此,但是比信號處理函數(shù)更加靈活,信號處理函數(shù)的控制流程只是在信號遞達時產(chǎn)生,在 處理完信號之后就結(jié)束,而多線程的控制流程可以長期并存,操作系統(tǒng)會在各線程之間調(diào)度和切換,就像在多個進程之間調(diào)度和切換一樣。
3、線程特性
同一進程的多個線程共享同一地址空間。其中Text Segment、 Data Segment都是共享的,如果定義一個函數(shù),在各線程中都可以調(diào)用,如果定義一個全局變量,在各線程中都可以訪問到,除此之外,各線程還共享以下進程資源和環(huán)境:(1)線件描述符表;(2)每種信號的處理方式(SIG_IGN、 SIG_DFL或者自定義的信號處理函數(shù));(3)當(dāng)前工作目錄;(4)用戶id和組id。但有些資源是每個線程獨有一分的:(1)線程id;(2)上下文,包括各種寄存器的值、程序計數(shù)器和棧指針;(3)??臻g;(4) errno變量;(5)信號屏蔽字;(6)調(diào)度優(yōu)先級。
4、線程的優(yōu)缺點
優(yōu)點:(1)通過為每種事件類型的處理分配單獨的線程,能夠簡化處理異步時間的代碼;
(2)多個線程可以自動共享相同的存儲地址空間和文件描述符;
(3)有些問題可以通過將其分解從而改善整個程序的吞吐量;
&n