咱們進行多線程編程,能夠有多種選擇,可使用WindowsAPI,若是你在使用GTK,也可使用GTK實現了的線程庫,若是你想讓你的程序有更多的移植性你最好是選擇POSIX中的Pthread函數庫,個人程序是在Linux下寫的,因此我使用了Pthread庫(是否是很傷心,我知道有很多人期待的是WindowsAPI的,好吧,有機會之後再講那個,如今先把這一系列專題寫完 ^_^)
若是你用的是LINUX/UNIX/MacOSX,那麼咱們已經能夠開始了,若是你用的是WINDOWS,那麼你須要從網站上下載PTHREAD的WINDOWS開發包,所幸他很是的小。網站地址是http://sourceware.org/pthreads-win32/
先來看一個基本的例子:
程序代碼
#include <pthread.h>
#include <iostream>
using namespace std;
void* tprocess1(void* args){
while(1){
cout << "tprocess1" << endl;
}
return NULL;
}
void* tprocess2(void* args){
while(1){
cout << "tprocess2" << endl;
}
return NULL;
}
int main(){
pthread_t t1;
pthread_t t2;
pthread_create(&t1,NULL,tprocess1,NULL);
pthread_create(&t2,NULL,tprocess2,NULL);
pthread_join(t1,NULL);
return 0;
}
在上面的例子中,咱們首先加入了pthread.h文件包含,這是因此pthread多線程程序所必須的,接着是iostream咱們進行輸入輸出時要用到,接着就是兩個函數的定義,這和普通的函數沒有什麼區別,之因此寫成的
程序代碼
void* tprocess1(void* args)
這樣的形式,徹底是爲了迎合pthread_create函數的參數類型,你也能夠不這樣定義,只要在調用pthread_create建立線程的時候強制轉換一下指針類型就能夠了。
這兩個函數將被用作線程的執行體,也就是說在兩個線程裏同時運行這兩個函數。
如今咱們來看main函數,和pthread有關的調用都在這裏了。
pthread_t是線程結構,用來保存線程相關數據,你也能夠理解爲是線程類型,聲明一個線程對象(變量)。
程序代碼
pthread_t t1;
pthread_t t2;
這裏咱們聲明瞭兩個線程變量t1,t2
程序代碼
pthread_create(&t1,NULL,tprocess1,NULL);
pthread_create(&t2,NULL,tprocess2,NULL);
這兩句很是重要,pthread_create用來建立線程並啓動,他的原型是
程序代碼
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);
咱們能夠知道第一個參數是線程指針,第二參數是線程屬性指針,線程屬性pthread_attr_t用來指定線程優先級等屬性,通常的狀況下,咱們沒有必要修改,使用默認屬性來構造線程,因此這裏通常取NULL,咱們也是這樣作的,第三個參數是一個函數指針(函數指針?什麼東西,沒據說過啊?……巨暈,好嘛,你複習一下C或是C++指針那部分吧)就是線程要執行的代碼,這裏咱們分別要執行tprocess1 tprocess2就寫成了上面的樣子,這裏這個函數指針的類型定義是返回一個空類型指針,接收一個空類型指針參數的函數指針,若是你的函數不是這個定義,那就能夠直接轉化一下就能夠了。
寫完這兩行代碼,兩個線程就已經執行起來了,可是若是你省略了
程序代碼
pthread_join(t1,NULL);
而後嘗試編譯運行程序的時候你會發現程序彷佛什麼也沒幹就退出了,是的,那是由於程序的主線程退出的時候操做系統會關閉應用程序使用的全部資源,包括線程……因此在main函數結束前咱們得想辦法讓程序停下來,pthread_join方法的功能就是等待線程結束,要等的線程就是第一個參數,程序會在這個地方停下來,直到線程結束,第二個參數用來接受線程函數的返回值,是void**類型的指針,若是沒有返回值,就直接設爲NULL吧。
程序寫好了,咱們怎麼編譯運行它呢?
若是你使用的是Linux:
在終端裏輸入
g++ thread.cpp -othread -lpthread
./thread
就能夠完成程序的編譯及運行
若是你用的是VC:
在工程屬性里加入開發包裏的幾個庫文件
把那幾個DLL文件放到你的工程路徑裏,也就是程序運行時候的工做路徑,這個在VC6和2005裏彷佛不太同樣,若是你不肯定,那就直接放到SYSTEM32裏吧。。。
下面的工做就很是簡單了
點運行,提示編譯,就肯定,好了,結果出來了。。。
是否是感受多線程如此的簡單,短短几行代碼就搞定了,我想你已經能夠寫出一個簡單的多線程程序了吧,呵呵,其實問題沒有這麼簡單,多線程咱們還要面對線程同步的問題,我會在下一個專題裏給你們講到。 html
出處:http://www.cnblogs.com/lovko/archive/2009/01/15/1376032.htmlios