a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

C語言編程中借助pthreads庫進行多線程編程的示例

2020-01-26 14:49:18
字體:
來源:轉載
供稿:網友

運行之前需要做一些配置:
1.下載PTHREAD的WINDOWS開發包 pthreads-w32-2-4-0-release.exe(任何一個版本均可)
   http://sourceware.org/pthreads-win32/ ,解壓到一個目錄。
2.找到include和lib文件夾,下面分別把它們添加到VC++6.0的頭文件路徑和靜態鏈接庫路徑下面:
   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文件復制到工程目錄下,即根目錄。 

我們進行多線程編程,可以有多種選擇,可以使用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里吧。。。
下面的工作就非常簡單了
點運行,提示編譯,就確定,好了,結果出來了。。。

是不是感覺多線程如此的簡單,短短幾行代碼就搞定了,我想你已經可以寫出一個簡單的多線程程序了吧,呵呵,其實問題沒有這么簡單,多線程我們還要面對線程同步的問題,我會在下一個專題里給大家講到。 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 久久久久久久99精品免费观看 | 性色av网 | 国产精品国产 | 国产一区二区三区视频在线观看 | 另类天堂 | 精品国产髙清在线看国产毛片 | 青青草av | 91精品综合久久久久久五月天 | 日韩国产一区二区 | 成人精品一区二区三区 | 夜夜春精品视频高清69式 | av片在线观看| 国产精品一区二区三区免费观看 | 欧美一区永久视频免费观看 | 久久亚洲精品裙底抄底 | 国内精品国产成人国产三级粉色 | 一区二区免费在线播放 | 日韩高清中文字幕 | 精品久久久久久久 | 欧美偷拍自拍 | 91在线精品一区二区 | 久久久成人精品 | 97视频免费| 看男人操女人逼 | 在线观看欧美日韩视频 | 性做久久久久久久免费看 | 国产 日韩 欧美 制服 另类 | 久久99精品久久久久久水蜜桃 | 午夜免费福利在线 | 亚洲视频精品 | 狠狠入ady亚洲精品经典电影 | 成人av视 | 欧美日本乱大交xxxxx | 日本一区二区视频在线观看 | 欧美不卡在线 | 日本色视频 | 日本高清视频一区二区三区 | 一区二区亚洲 | 久久久国产精品入口麻豆 | 成人一区二区三区在线观看 | 欧美一级全黄 |