引言
線程(thread)技術(shù)早在60年代就被提出,但真正應(yīng)用多線程到操作系統(tǒng)中去,是在80年代中期,solaris是這方面的佼佼者 。傳統(tǒng)的Unix也支持線程的概念,但是在一個進(jìn)程(process)中只允許有一個線程,這樣多線程就意味著多進(jìn)程 ?,F(xiàn)在,多線程技術(shù)已經(jīng)被許多操作系統(tǒng)所支持,包括Windows/NT,當(dāng)然,也包括Linux 。
為什么有了進(jìn)程的概念后,還要再引入線程呢?使用多線程到底有哪些好處?什么的系統(tǒng)應(yīng)該選用多線程?我們首先必須回答這些問題 。
使用多線程的理由之一是和進(jìn)程相比,它是一種非常"節(jié)儉"的多任務(wù)操作方式 。我們知道,在Linux系統(tǒng)下,啟動一個新的進(jìn)程必須分配給它獨立的地址空間,建立眾多的數(shù)據(jù)表來維護它的代碼段、堆棧段和數(shù)據(jù)段,這是一種"昂貴"的多任務(wù)工作方式 。而運行于一個進(jìn)程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動一個線程所花費的空間遠(yuǎn)遠(yuǎn)小于啟動一個進(jìn)程所花費的空間,而且,線程間彼此切換所需的時間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需要的時間 。
使用多線程的理由之二是線程間方便的通信機制 。對不同進(jìn)程來說,它們具有獨立的數(shù)據(jù)空間,要進(jìn)行數(shù)據(jù)的傳遞只能通過通信的方式進(jìn)行,這種方式不僅費時,而且很不方便 。線程則不然,由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便 。當(dāng)然,數(shù)據(jù)的共享也帶來其他一些問題,有的變量不能同時被兩個線程所修改,有的子程序中聲明為static的數(shù)據(jù)更有可能給多線程程序帶來災(zāi)難性的打擊,這些正是編寫多線程程序時最需要注意的地方 。
除了以上所說的優(yōu)點外,不和進(jìn)程比較,多線程程序作為一種多任務(wù)、并發(fā)的工作方式,當(dāng)然有以下的優(yōu)點:
1) 提高應(yīng)用程序響應(yīng) 。這對圖形界面的程序尤其有意義,當(dāng)一個操作耗時很長時,整個系統(tǒng)都會等待這個操作,此時程序不會響應(yīng)鍵盤、鼠標(biāo)、菜單的操作,而使用多線程技術(shù),將耗時長的操作(time consuming)置于一個新的線程,可以避免這種尷尬的情況 。
2) 使多CPU系統(tǒng)更加有效 。操作系統(tǒng)會保證當(dāng)線程數(shù)不大于CPU數(shù)目時,不同的線程運行于不同的CPU上 。
3) 改善程序結(jié)構(gòu) 。一個既長又復(fù)雜的進(jìn)程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利于理解和修改 。
下面我們先來嘗試編寫一個簡單的多線程程序 。
簡單的多線程編程
Linux系統(tǒng)下的多線程遵循POSIX線程接口,稱為pthread 。編寫Linux下的多線程程序,需要使用頭文件pthread.h,連接時需要使用庫libpthread.a 。順便說一下,Linux下pthread的實現(xiàn)是通過系統(tǒng)調(diào)用clone()來實現(xiàn)的 。clone()是Linux所特有的系統(tǒng)調(diào)用,它的使用方式類似fork,關(guān)于clone()的詳細(xì)情況,有興趣的讀者可以去查看有關(guān)文檔說明 。下面我們展示一個最簡單的多線程程序example1.c 。
/* example.c*/
#include
#include
void thread(void)
{
int i;
for(i=0;i<3;i)
printf("This is a pthread.n");
}
int main(void)
{
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);
if(ret!=0){
printf ("Create pthread error!n");
exit (1);
}
for(i=0;i<3;i)
printf("This is the main process.n");
pthread_join(id,NULL);
return (0);
}
我們編譯此程序:
gcc example1.c -lpthread -o example1
運行example1,我們得到如下結(jié)果:
This is the main process.
This is a pthread.
This is the main process.
This is the main process.
This is a pthread.
This is a pthread.
推薦閱讀
- 圖 打造完美Linux系統(tǒng):用戶管理
- 圖 讓Red Hat9.0與XP組成雙系統(tǒng)
- 哪些條件下可以適用簡易程序?qū)徟?
- 榴蓮不太熟在太陽下曬一下可以嗎
- 基于Linux的網(wǎng)絡(luò)安全策略和保護措施
- 高手進(jìn)階必讀:Linux內(nèi)核的同步機制
- 自由組合:Linux下攻擊軟件大薈萃
- OPPO R15劉海適配有問題嗎?OPPO R15系統(tǒng)評測
- 里應(yīng)外合:Linux下的后門和日志工具
- 圖 魔鬼訓(xùn)練營:Red Hat Linux速成班
