C語言編程中借助pthreads庫進行多線程編程的示例
運行之前需要做一些配置:
1.下載PTHREAD的WINDOWS開發(fā)包 pthreads-w32-2-4-0-release.exe(任何一個版本均可)
http://sourceware.org/pthreads-win32/ ,解壓到一個目錄。
2.找到include和lib文件夾,下面分別把它們添加到VC++6.0的頭文件路徑和靜態(tài)鏈接庫路徑下面:
a).Tools->Options,選擇Directory頁面,然后在Show directories for:中選擇Include files(默認) 在Directories中添加include的路徑。在Show directories for:中選擇Library files,
在Directories中添加lib的路徑。
b).Project->Settings,選擇Link頁面,然后將lib下的*.lib文件添加到Object/library Modules,
各lib文件以空格隔開。
c).將lib下的*.dll文件復(fù)制到工程目錄下,即根目錄。
我們進行多線程編程,可以有多種選擇,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK實現(xiàn)了的線程庫,如果你想讓你的程序有更多的移植性你最好是選擇POSIX中的Pthread函數(shù)庫,我的程序是在Linux下寫的,所以我使用了Pthread庫(是不是很傷心,我知道有不少人期待的是WindowsAPI的,好吧,有機會以后再講那個,現(xiàn)在先把這一系列專題寫完 ^_^)
如果你用的是LINUX/UNIX/MacOSX,那么我們已經(jīng)可以開始了,如果你用的是WINDOWS,那么你需要從網(wǎng)站上下載PTHREAD的WINDOWS開發(fā)包,所幸他非常的小。網(wǎng)站地址是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我們進行輸入輸出時要用到,接著就是兩個函數(shù)的定義,這和普通的函數(shù)沒有什么區(qū)別,之所以寫成的
void* tprocess1(void* args)
這樣的形式,完全是為了迎合pthread_create函數(shù)的參數(shù)類型,你也可以不這樣定義,只要在調(diào)用pthread_create創(chuàng)建線程的時候強制轉(zhuǎn)換一下指針類型就可以了。
這兩個函數(shù)將被用做線程的執(zhí)行體,也就是說在兩個線程里同時運行這兩個函數(shù)。
現(xiàn)在我們來看main函數(shù),和pthread有關(guān)的調(diào)用都在這里了。
pthread_t是線程結(jié)構(gòu),用來保存線程相關(guān)數(shù)據(jù),你也可以理解為是線程類型,聲明一個線程對象(變量)。
pthread_t t1; pthread_t t2;
這里我們聲明了兩個線程變量t1,t2
pthread_create(&t1,NULL,tprocess1,NULL); pthread_create(&t2,NULL,tprocess2,NULL);
這兩句非常重要,pthread_create用來創(chuàng)建線程并啟動,他的原型是
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);
我們可以知道第一個參數(shù)是線程指針,第二參數(shù)是線程屬性指針,線程屬性pthread_attr_t用來指定線程優(yōu)先級等屬性,一般的情況下,我們沒有必要修改,使用默認屬性來構(gòu)造線程,所以這里一般取NULL,我們也是這樣做的,第三個參數(shù)是一個函數(shù)指針(函數(shù)指針?什么東西,沒聽說過?。俊迺?,好嘛,你復(fù)習(xí)一下C或是C++指針那部分吧)就是線程要執(zhí)行的代碼,這里我們分別要執(zhí)行tprocess1 tprocess2就寫成了上面的樣子,這里這個函數(shù)指針的類型定義是返回一個空類型指針,接收一個空類型指針參數(shù)的函數(shù)指針,如果你的函數(shù)不是這個定義,那就可以直接轉(zhuǎn)化一下就可以了。
寫完這兩行代碼,兩個線程就已經(jīng)執(zhí)行起來了,但是如果你省略了
pthread_join(t1,NULL);
然后嘗試編譯運行程序的時候你會發(fā)現(xiàn)程序似乎什么也沒干就退出了,是的,那是因為程序的主線程退出的時候操作系統(tǒng)會關(guān)閉應(yīng)用程序使用的所有資源,包括線程……所以在main函數(shù)結(jié)束前我們得想辦法讓程序停下來,pthread_join方法的功能就是等待線程結(jié)束,要等的線程就是第一個參數(shù),程序會在這個地方停下來,直到線程結(jié)束,第二個參數(shù)用來接受線程函數(shù)的返回值,是void**類型的指針,如果沒有返回值,就直接設(shè)為NULL吧。
程序?qū)懞昧耍覀冊趺淳幾g運行它呢?
如果你使用的是Linux:
在終端里輸入
g++ thread.cpp -othread -lpthread ./thread
就可以完成程序的編譯及運行
如果你用的是VC:
在工程屬性里加入開發(fā)包里的幾個庫文件
把那幾個DLL文件放到你的工程路徑里,也就是程序運行時候的工作路徑,這個在VC6和2005里似乎不太一樣,如果你不確定,那就直接放到SYSTEM32里吧。。。
下面的工作就非常簡單了
點運行,提示編譯,就確定,好了,結(jié)果出來了。。。
是不是感覺多線程如此的簡單,短短幾行代碼就搞定了,我想你已經(jīng)可以寫出一個簡單的多線程程序了吧,呵呵,其實問題沒有這么簡單,多線程我們還要面對線程同步的問題,我會在下一個專題里給大家講到。
欄 目:C語言
下一篇:快速學(xué)習(xí)C語言中for循環(huán)語句的基本使用方法
本文標(biāo)題:C語言編程中借助pthreads庫進行多線程編程的示例
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2650.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法