Linux 多執行緒程式設計(一)

2021-05-27 05:58:28 字數 2550 閱讀 6083

1、建立執行緒:

有乙個比較特殊的執行緒, 就是主線程或者稱為初始執行緒,它是當乙個程序被建立時建立的。而其他執行緒則是在初始執行緒中呼叫pthread_create建立的。建立的新執行緒初始為ready狀態,等待處理器排程。

2、執行執行緒:

執行緒被建立後,就會執行phtread_create的start引數指定的函式,我們可以通過pthread_create的arg引數向執行緒開始函式傳遞乙個引數,若不想傳就直接賦值null。

上面提到了乙個特殊的執行緒:初始執行緒,由作業系統shell呼叫。作業系統先初始化程序,然後執行主線程的開始函式main。注意:初始執行緒和我們自己建立的執行緒有稍許不同:-開始函式引數不同,main的引數是int arg, char* argv,而我們自己的執行緒引數是void* arg。-自己建立的執行緒開始函式返回了,其它執行緒可以繼續執行。而初始執行緒開始函式main返回後程序會終止,導致其它正在執行的執行緒也就被強行終止若不想在main退出後關閉程序,可以在main最後呼叫pthread_exit,不過此時該程序就成了殭屍程序(defunct)直到所有執行緒執行完畢

如下程式,沒有呼叫pthread_exit,初始執行緒退出時子執行緒也退出,當調pthread_exit後,主線程退出時,子執行緒仍然執行。

#include

#include

#include

#include

void pthead_1() }

void main()

pthread_exit函式使主線程退出。

-還有乙個很重要的區別,多數系統上,初始執行緒使用的是程序的棧而自己建立的執行緒則使用自己的棧,往往自建執行緒的棧沒有初始執行緒的棧空間大,要注意執行緒棧溢位哦!

3、 執行和阻塞 

執行緒兄弟和我們一樣,不能一直都醒著工作,它也要休息。執行緒一生大多處於三種狀態:ready, running, 和blocked(和我一樣,吃飯,工作,睡覺^_^)。執行緒被建立時出於就緒狀態就緒狀態等待處理器,處理器有空閒了,執行緒就轉到執行狀態瘋狂工作,突然發現自己需要的其它資源(互斥量,條件變數)在別的執行緒手裡,或者別的執行緒優先順序比自己大一下從它手裡搶走了處理器,或處理器煩了它了(時間片已經用完),或自己不好意思不幹事還占用處理器了(等待i/o操作完成),就轉換成阻塞狀態,停止執行,可以休息下了。 休息可不是給它放長假,任務還沒完成了...繼續,當等待的資源得到滿足,再次投入工作,進入執行狀態。周而復始,直到任務完成。

4、 終止執行緒:

執行緒一般都是在開始函式執行完時終止的。執行緒開始函式中呼叫pthread_exit或者其它執行緒呼叫pthread_cancel都可以終止執行緒終止後執行緒處於terminated狀態(注意:不是destroyed

若是joinable,那就需要初始執行緒或其他執行緒呼叫pthread_join來等待要終止的執行緒了, 同時還可以通過pthread_joind的第二個引數獲得執行緒的返回值。pthread_join後,執行緒就被detached //分離狀態,然後被系統**。

下面討論幾種執行緒終止情況:

1)、主線程等待子執行緒結束

可以用pthread_join函式,pthread_join()函式會等待指定執行緒的結束,也就是主線程會為子執行緒阻塞,如果子執行緒沒有執行完,那麼主線程就永遠不會執行phread_join()下面的程式。程式如下:

#include

#include

void pthread_1()

void main()

2)、主線程終止子執行緒

在posix   thread中線程有兩中取消狀態:立即取消和延遲取消

立即取消就是pthread_cancel之後,不管理執行緒在幹什麼,馬上終止這個執行緒

而延遲取消是在pthread_cancel之後,執行緒會繼續執行,直到遇到乙個 "取消點函式 "

系統預設的是延遲取消

如果想要結束執行緒有幾個方法

a.執行緒設定為立即取消

pthread_setcanceltype(pthread_cancel_asynchronous,   null);  

程式如下

#include

#include

#include

#include

void pthead_1() }

void main()

b.在你的執行緒中加入一些取消點函式的呼叫

while(   1   )

5、 **執行緒

執行緒建立時,detachsate屬性是pthread_create_detached,則在開始函式返回後被**。

或其他執行緒使用了pthread_join 或自己呼叫了pthread_detach,執行緒出於terminated狀態後,立馬就會被系統**:釋放系統資源和程序資源,包含執行緒返回值占用的記憶體,執行緒堆疊,暫存器狀態等等。

Linux多執行緒網路程式設計(一)

再次開始網路程式設計已經是乙個學期之後了。上個學期完成網路程式設計之後還沒有來得及總結,最近重新開始網路程式設計還遇到了不少的麻煩。直奔主題 在伺服器端實現的功能 1.通過tcp ip 協議,獲取客戶端傳送的檔案。2.定義了幾個簡單的指令,對客戶端進行控制。功能特點 能同時處理最多五個客戶端的請求。...

linux多執行緒程式設計小結 一

執行緒是程序基本的基本排程單位。而程序是程式執行和資源分配的最小單位。可以減少資源的開銷.執行緒有專門的執行緒庫來呼叫thread.執行緒的建立用thread create int pthread create pthread t restrict thread,const pthread attr...

Linux 多執行緒程式設計

1.建立執行緒和退出的函式原型 int pthread create pthread t thread,pthread attr t attr,void start routine void void arg pthread exit 0 其他還有很多相關的函式。2.編譯時要加上 lpthread ...