C說話編程中借助pthreads庫停止多線程編程的示例。本站提示廣大學習愛好者:(C說話編程中借助pthreads庫停止多線程編程的示例)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話編程中借助pthreads庫停止多線程編程的示例正文
運轉之前須要做一些設置裝備擺設:
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裡吧。。。
上面的任務就異常簡略了
點運轉,提醒編譯,就肯定,好了,成果出來了。。。
是否是感到多線程如斯的簡略,短短幾行代碼就弄定了,我想你曾經可以寫出一個簡略的多線程法式了吧,呵呵,其實成績沒有這麼簡略,多線程我們還要面臨線程同步的成績,我會鄙人一個專題裡給年夜家講到。