国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C語(yǔ)言編程中借助pthreads庫(kù)進(jìn)行多線程編程的示例

2020-05-23 14:12:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章主要介紹了C語(yǔ)言編程中借助pthreads庫(kù)進(jìn)行多線程編程的示例,文中的示例環(huán)境為Windows系統(tǒng),需要的朋友可以參考下

運(yùn)行之前需要做一些配置:

1.下載PTHREAD的WINDOWS開(kāi)發(fā)包 pthreads-w32-2-4-0-release.exe(任何一個(gè)版本均可)

http://sourceware.org/pthreads-win32/ ,解壓到一個(gè)目錄。

2.找到include和lib文件夾,下面分別把它們添加到VC++6.0的頭文件路徑和靜態(tài)鏈接庫(kù)路徑下面:

a).Tools->Options,選擇Directory頁(yè)面,然后在Show directories for:中選擇Include files(默認(rèn)) 在Directories中添加include的路徑。在Show directories for:中選擇Library files,

在Directories中添加lib的路徑。

b).Project->Settings,選擇Link頁(yè)面,然后將lib下的*.lib文件添加到Object/library Modules,

各lib文件以空格隔開(kāi)。

c).將lib下的*.dll文件復(fù)制到工程目錄下,即根目錄。

我們進(jìn)行多線程編程,可以有多種選擇,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK實(shí)現(xiàn)了的線程庫(kù),如果你想讓你的程序有更多的移植性你最好是選擇POSIX中的Pthread函數(shù)庫(kù),我的程序是在Linux下寫(xiě)的,所以我使用了Pthread庫(kù)(是不是很傷心,我知道有不少人期待的是WindowsAPI的,好吧,有機(jī)會(huì)以后再講那個(gè),現(xiàn)在先把這一系列專(zhuān)題寫(xiě)完 ^_^)

如果你用的是LINUX/UNIX/MacOSX,那么我們已經(jīng)可以開(kāi)始了,如果你用的是WINDOWS,那么你需要從網(wǎng)站上下載PTHREAD的WINDOWS開(kāi)發(fā)包,所幸他非常的小。網(wǎng)站地址是http://sourceware.org/pthreads-win32/

示例

先來(lái)看一個(gè)基本的例子:

 

 
  1. #include <pthread.h> 
  2. #include <iostream> 
  3.  
  4. using namespace std; 
  5.  
  6. void* tprocess1(void* args){ 
  7. while(1){ 
  8. cout << "tprocess1" << endl; 
  9. return NULL; 
  10.  
  11. void* tprocess2(void* args){ 
  12. while(1){ 
  13. cout << "tprocess2" << endl; 
  14. return NULL; 
  15.  
  16. int main(){ 
  17. pthread_t t1; 
  18. pthread_t t2; 
  19. pthread_create(&t1,NULL,tprocess1,NULL); 
  20. pthread_create(&t2,NULL,tprocess2,NULL); 
  21. pthread_join(t1,NULL); 
  22. return 0; 

在上面的例子中,我們首先加入了pthread.h文件包含,這是所以pthread多線程程序所必須的,接著是iostream我們進(jìn)行輸入輸出時(shí)要用到,接著就是兩個(gè)函數(shù)的定義,這和普通的函數(shù)沒(méi)有什么區(qū)別,之所以寫(xiě)成的

 

 
  1. void* tprocess1(void* args) 

這樣的形式,完全是為了迎合pthread_create函數(shù)的參數(shù)類(lèi)型,你也可以不這樣定義,只要在調(diào)用pthread_create創(chuàng)建線程的時(shí)候強(qiáng)制轉(zhuǎn)換一下指針類(lèi)型就可以了。

這兩個(gè)函數(shù)將被用做線程的執(zhí)行體,也就是說(shuō)在兩個(gè)線程里同時(shí)運(yùn)行這兩個(gè)函數(shù)。

現(xiàn)在我們來(lái)看main函數(shù),和pthread有關(guān)的調(diào)用都在這里了。

pthread_t是線程結(jié)構(gòu),用來(lái)保存線程相關(guān)數(shù)據(jù),你也可以理解為是線程類(lèi)型,聲明一個(gè)線程對(duì)象(變量)。

 

 
  1. pthread_t t1; 
  2. pthread_t t2; 

這里我們聲明了兩個(gè)線程變量t1,t2

 

 
  1. pthread_create(&t1,NULL,tprocess1,NULL); 
  2. pthread_create(&t2,NULL,tprocess2,NULL); 

這兩句非常重要,pthread_create用來(lái)創(chuàng)建線程并啟動(dòng),他的原型是

 

 
  1. int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); 

我們可以知道第一個(gè)參數(shù)是線程指針,第二參數(shù)是線程屬性指針,線程屬性pthread_attr_t用來(lái)指定線程優(yōu)先級(jí)等屬性,一般的情況下,我們沒(méi)有必要修改,使用默認(rèn)屬性來(lái)構(gòu)造線程,所以這里一般取NULL,我們也是這樣做的,第三個(gè)參數(shù)是一個(gè)函數(shù)指針(函數(shù)指針?什么東西,沒(méi)聽(tīng)說(shuō)過(guò)啊?……巨暈,好嘛,你復(fù)習(xí)一下C或是C++指針那部分吧)就是線程要執(zhí)行的代碼,這里我們分別要執(zhí)行tprocess1 tprocess2就寫(xiě)成了上面的樣子,這里這個(gè)函數(shù)指針的類(lèi)型定義是返回一個(gè)空類(lèi)型指針,接收一個(gè)空類(lèi)型指針參數(shù)的函數(shù)指針,如果你的函數(shù)不是這個(gè)定義,那就可以直接轉(zhuǎn)化一下就可以了。

寫(xiě)完這兩行代碼,兩個(gè)線程就已經(jīng)執(zhí)行起來(lái)了,但是如果你省略了

 

 
  1. pthread_join(t1,NULL); 

然后嘗試編譯運(yùn)行程序的時(shí)候你會(huì)發(fā)現(xiàn)程序似乎什么也沒(méi)干就退出了,是的,那是因?yàn)槌绦虻闹骶€程退出的時(shí)候操作系統(tǒng)會(huì)關(guān)閉應(yīng)用程序使用的所有資源,包括線程……所以在main函數(shù)結(jié)束前我們得想辦法讓程序停下來(lái),pthread_join方法的功能就是等待線程結(jié)束,要等的線程就是第一個(gè)參數(shù),程序會(huì)在這個(gè)地方停下來(lái),直到線程結(jié)束,第二個(gè)參數(shù)用來(lái)接受線程函數(shù)的返回值,是void**類(lèi)型的指針,如果沒(méi)有返回值,就直接設(shè)為NULL吧。

程序?qū)懞昧耍覀冊(cè)趺淳幾g運(yùn)行它呢?

如果你使用的是Linux:

在終端里輸入

 

 
  1. g++ thread.cpp -othread -lpthread 
  2. ./thread 

就可以完成程序的編譯及運(yùn)行

如果你用的是VC:

在工程屬性里加入開(kāi)發(fā)包里的幾個(gè)庫(kù)文件

把那幾個(gè)DLL文件放到你的工程路徑里,也就是程序運(yùn)行時(shí)候的工作路徑,這個(gè)在VC6和2005里似乎不太一樣,如果你不確定,那就直接放到SYSTEM32里吧。。。

下面的工作就非常簡(jiǎn)單了

點(diǎn)運(yùn)行,提示編譯,就確定,好了,結(jié)果出來(lái)了。。。

是不是感覺(jué)多線程如此的簡(jiǎn)單,短短幾行代碼就搞定了,我想你已經(jīng)可以寫(xiě)出一個(gè)簡(jiǎn)單的多線程程序了吧,呵呵,其實(shí)問(wèn)題沒(méi)有這么簡(jiǎn)單,多線程我們還要面對(duì)線程同步的問(wèn)題,我會(huì)在下一個(gè)專(zhuān)題里給大家講到。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 虹口区| 资溪县| 昌黎县| 潮州市| 龙口市| 盐池县| 五莲县| 洛南县| 镇坪县| 昭平县| 乐清市| 永靖县| 信宜市| 鄂托克前旗| 保靖县| 丘北县| 昔阳县| 光山县| 宜黄县| 临高县| 绵阳市| 陕西省| 纳雍县| 长汀县| 神农架林区| 合作市| 安阳市| 柏乡县| 甘孜县| 监利县| 务川| 洛扎县| 定南县| 左云县| 敖汉旗| 吴江市| 黑河市| 鹤岗市| 平遥县| 巫溪县| 正镶白旗|