C 多執行緒類庫的設計與實現(二)

2021-06-08 19:18:02 字數 2196 閱讀 8052

歷史回顧---c

時代的多執行緒設計

linux

和windows

上的開發環境。為簡單起見,在後續內容中我們將使用

linux

作為主要開發平台,以

g++(gcc)3.4.4

為開發環境。

我們首先來回顧一下在

c中是怎樣設計多執行緒程式的。

假設我們要設計乙個程式,它包含兩個執行緒。主線程用於響應使用者命令,當使用者在標準輸入上鍵入

」quit

」並按下回車後就結束程式,另外乙個執行緒則每隔

3秒鐘在標準輸出上列印一行

」i am alive

」訊息。

這樣的程式應該是下面這個樣子。

// file : thread1.c

#include

#include

extern volatile int g_iquitflag;

void *thread1_function(void *arg)

return null; }

//--eof--

// file : main.c

#include

#include

#include

#include

volatile int g_iquitflag;

extern void *thread1_function(void *arg);

int main()

while(1) }

pthread_join(t1, null);

return 0; }

//--eof--

兩個檔案應該被放到同乙個目錄下,編譯命令為:

g++ main.c thread1.c -lpthread

環境配置沒有問題的話,編譯器(以及被自動呼叫的鏈結器)將產生乙個名為

a.out

的檔案。執行該檔案:

***x$ ./a.out

到目前為止,一切看起來都很順利。我們為子執行緒編寫乙個例程函式,然後在主線程建立子執行緒。主線程中通過改變全域性變數的值來通知子執行緒結束自己。主線程在設定該全域性變數後等待子執行緒結束後退出,程式結束。

上面的例子中有乙個小問題,就是使用者在輸入「

quit

」後程式不是立即退出的,需要等一小會。這是因為子執行緒每隔

3秒鐘檢查一次退出標誌,在下乙個

3秒鐘到來之前子執行緒是沒有響應的。我們在稍後的文章中將介紹乙個更好的辦法來解決這個問題。

這個程式的

windows

版本如下。

// file : thread1.c

#include

#include

extern volatile int g_iquitflag;

dword winapi thread1_function(lpvoid arg)

return 0; }

//--eof--

// file : main.c

#include

#include

#include

#include

volatile int g_iquitflag;

extern dword winapi thread1_function(lpvoid arg);

int main()

while(1) }

waitforsingleobject(t1, infinite);

closehandle(t1);

return 0; }

//--eof--

注意到windows

的sleep

單位是毫秒,而

linux

的sleep

單位是秒。另外

windows

我們可以使用

ide建立乙個程式專案來編譯程式,也可以使用命令列來編譯。命令列的編譯指令為:

cl main.c thread1.c /mt

注意vc++

的多執行緒庫開關

mt。使用

ide的場合也需要開啟多執行緒庫支援開關。

C 多執行緒類庫的設計與實現(三)

嘗試再增加乙個執行緒 c開發多執行緒程式的例子,並同時給出了這個程式的 linux 版本和windows 版本。我們現在希望在這個例子基礎上再增加乙個執行緒,這個執行緒每隔 2秒鐘計算一次整數級數求和,並在標準輸出上列印結果。file thread2.c include include extern...

C 多執行緒類庫的設計與實現(八)完

物件導向的多執行緒程式設計 我們用乙個簡單的例子來結束這個程式設計系列。我們用c 類庫重寫一開始的例子。include include volatile bool g iquitflag false class mytask1 public thread class mytask2 public t...

C 類中多執行緒實現

c 類中多執行緒實現 1.在學習c 多執行緒過程中,很多教程實現的是類外部函式呼叫,如何實現在本類中呼叫成員函式實現多執行緒,查閱相關資料使用bind函式繫結所呼叫函式,也可以將bind函式省略,本例中func1使用bind函式,func2將bind函式省略,關於bind函式的原型,可查閱相關資料,...