歷史回顧---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函式的原型,可查閱相關資料,...