C語言多執行緒程式設計基礎

2021-07-11 04:28:30 字數 2277 閱讀 6039

我們進行多執行緒程式設計,可以有多種選擇,可以使用windowsapi,如果你在使用gtk,也可以使用gtk實現了的執行緒庫,如果你想讓你的程式有更多的移植性你最好是選擇posix中的pthread函式庫,我的程式是在linux下寫的,所以我使用了pthread庫(是不是很傷心,我知道有不少人期待的是windowsapi的,好吧,有機會以後再講那個,現在先把這一系列專題寫完 ^_^)

先來看乙個基本的例子:

程式**

using namespace std;

void* tprocess1(void* args)

return null;void* tprocess2(void* args)

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裡吧。。。

下面的工作就非常簡單了

點執行,提示編譯,就確定,好了,結果出來了。。。

C 多執行緒程式設計基礎

使用執行緒有幾個原因。假設從應用程式中進行網路呼叫需要一定的時間。使用者不希望分割使用者界,並且讓使用者一直等待直到從伺服器返回乙個響應為止。使用者可以同時執行其他一些操作,或者甚至取消傳送給伺服器的請求。這些都可以使用執行緒來實現。對於所有需要等待的操作,例如,因為檔案 資料庫或網路訪問都需要一定...

C 學習 多執行緒程式設計 多執行緒基礎

c 內建了對多執行緒程式設計的支援功能,所以相對於其他語言在多執行緒方面的問題,c 這裡就已經最小化或者不復存在。在.net framework 4.0中,c 中新增了兩個與多執行緒應用程式相關的重要功能 tpl 任務執行並行庫 和plinq 並行linq 兩者都提供對並行程式設計的支援,都可以利用...

C 語言多執行緒程式設計

一 linux 下相關函式 函式描述 intpthread create pthread t thread,pthread attr t attr,void start routine void void arg 建立乙個新的執行緒。編譯時帶上 lpthread.引數說明 thread 是乙個指標,...