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

2021-06-08 19:18:02 字數 2313 閱讀 2884

嘗試再增加乙個執行緒

c開發多執行緒程式的例子,並同時給出了這個程式的

linux

版本和windows

版本。我們現在希望在這個例子基礎上再增加乙個執行緒,這個執行緒每隔

2秒鐘計算一次整數級數求和,並在標準輸出上列印結果。

// file : thread2.c

#include

#include

extern volatile int g_iquitflag;

const int max_i = 65534;

int sum(int n)

else }

void *thread2_function(void *arg)

return null; }

//--eof--

執行緒2呼叫遞迴函式計算整數級數求和,如果到達可計算範圍的上限就退出。

相應地,

main.c

檔案也需要作一些修改。

// file : main.c

#include

#include

#include

#include

volatile int g_iquitflag;

extern void *thread1_function(void *arg);

extern void *thread2_function(void *arg);

int main()

ires = pthread_create(&t2, null, thread2_function, null);

if (ires != 0)

while(true) }

pthread_join(t1, null);

pthread_join(t2, null);

return 0; }

//--eof--

main

函式兩次呼叫

pthread_create

分別建立兩個執行緒。如果第二個執行緒建立失敗,則呼叫

pthread_cancel

強制結束第乙個執行緒,然後呼叫

exit

結束程式。一般來說應該謹慎使用

pthread_cancle

,因為如果被結束執行緒沒有適當對應很可能會因為資源沒有釋放而造成程式死鎖等嚴重問題。本程式中只是為了簡單示例,所以沒有什麼問題。

windows

版本的程式**從略。

現在我們再來重新審視一下我們編寫的程式。我們發現,首先,程式幾乎是不可移植的。我們已經說過,與執行緒有關的系統呼叫都是和作業系統緊密相關的。我們現在給出了

linux

(嚴格地說是

linux

平台的posix

)和windows

版本的多執行緒程式,看起來程式變動不大。然而在實際的開發專案中,為了移植而作這種底層

api的變動非常耗時而且很容易產生

bug,

通常遇到這種情況還不如為各自的平台重新定製來得省事。

c++這種

oo語言具有封裝的特性,封裝性可以用來隱藏物件內部資料,也可以用來隱蔽作業系統相關的特性。我們可以想象,如果我們設計了乙個隱蔽了作業系統特性的執行緒類,我們就可以不費吹灰之力來完成平台移植的**修改工作

---至少與執行緒相關**基本不用修改。

我們再來看一下這兩個執行緒的例程函式。執行緒

1和執行緒

2的結構比較類似,二者都進入乙個迴圈,每隔一段時間就去做一些處理,然後每次都檢測程式退出標誌以判斷是否應該退出執行緒迴圈。然而我們不得不為兩個執行緒編寫各自的例程函式,儘管它們如此的相像。另外,這個例子中兩個執行緒都檢查全域性的程式退出標誌,而實際應用中一般都需要分別控制各個執行緒的執行,在必要的時候結束特定的某個執行緒。

本例中的這樣的執行緒被稱作後台執行緒(

background threads

),因為它們不直接和使用者打交道,雖然它們使用了標準輸出,但這只是本例的乙個簡單化設計。後台執行緒的控制相對簡單,它們一般只需要在某個特定的時間點被執行,然後在特定的時間點退出。相比之下,前台執行緒(

foreground threads

),也就是響應使用者事件的執行緒(如本例中的主線程),需要更為複雜的控制機制,一般採用非同步通訊機制和事件響應程式設計模式。

一般而言,乙個程式可能會有多個後台執行緒,而只有乙個甚至沒有前台執行緒。回想一下我們的執行緒類設計目標,簡單,實用,方便移植,我們決定只為後台執行緒建模設計類,因為後台執行緒模型比較簡單,易於實現,而且設計的收益也比較大。對於前台執行緒,可以將其視為特殊的後台執行緒,通過在後台執行緒模型的基礎上增加事件響應模型的擴充套件方法來進行對應。

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

歷史回顧 c 時代的多執行緒設計 linux 和windows 上的開發環境。為簡單起見,在後續內容中我們將使用 linux 作為主要開發平台,以 g gcc 3.4.4 為開發環境。我們首先來回顧一下在 c中是怎樣設計多執行緒程式的。假設我們要設計乙個程式,它包含兩個執行緒。主線程用於響應使用者命...

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

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

C 多執行緒 mutex類 (三)

mutex 類 詳細方法介紹參見c ref recursive mutex timed mutex recursive timed mutex 整合了recursive mutex和timed mutex特性 lock方法執行區別 對任意的mutex type物件,若其 cur mutex 已被其他...