執行緒建立後,避免主線程先於子執行緒結束的四種方式

2021-10-24 02:30:49 字數 1170 閱讀 7294

建立執行緒後,倘若不進行處理,會出現執行緒沒有執行完,主線程就退出(意味著整個程式退出)的情況,如下例所示,為了避免這種情況,可以使用sleep、pthread_join、主線程中使用pthread_exit()幾種方法來處理:

示例:建立執行緒後,不做任何處理的情況:

————子執行緒未執行完,主線程已經退出了。。。。

使用如下幾種方法,可以避免這種情況。 

int main()

{ pthread_t pid;

pthread_create(&pid,null,foo,null);

cout<

void* foo(void*)

{ for(int i=0;i<5;i++)

{cout<

分析:發現main函式中的cout <

void* foo(void*)

{ for(int i=0;i<5;i++)

{cout<

結果分析:可以看到列印出了end,所以子執行緒執行完,主線程才繼續執行,即:使用pthread_join函式,使主線程阻塞,保證了子執行緒結束後,主線程才繼續執行,同時,主線程清理子執行緒資源。

我們知道,int pthread_join(pthread_t thread, void **retval); 函式通過引數 retval**的執行緒函式的返回值,參考這篇文章

void* foo(void*)

{ for(int i=0;i<5;i++)

{cout<

結果分析:使用detach函式與sleep的聯合使用,比單純的使用sleep要好,因為detach函式能夠使子執行緒分離,從而子執行緒結束後能夠自己清理資源。

ps:在qt中建立執行緒,發現僅用了phtread_detach函式,沒有用sleep函式,子執行緒依然能保證執行完整。

這是因為qt中,return a.exec();  使程式一直處於事件佇列迴圈中,故程式一直沒有沒有退出。可以執行程式,從輸出結果相比較上幾種情況

void* foo(void*)

{ for(int i=0;i<5;i++)

{cout<

主線程和子執行緒

子執行緒通過 handlerthread的thread.getlooper 繫結,在主線程的handler的handlermessage中呼叫threadhandler.sendmessagedelay msg,1000 向子執行緒傳送訊息。在子執行緒中通過handler.sendmessagede...

主線程和子執行緒

主線程負責管理由它建立的子執行緒,建立 啟動 掛起 停止等。主線程通過發訊息的方式管理子執行緒,例如,給子執行緒傳送start 訊息,子執行緒啟動,子執行緒執行入口的run 方法。thread有下面兩個構造方法 thread runnable target,string name thread ru...

主線程和子執行緒總結

執行結果 從上面可以看到 如果主線程和子執行緒是並行的,雖然都是用while 1 但是倚靠 cpu的排程,主線程和子執行緒都有機會得到執行。如果要在子執行緒裡面改變主線程裡面的資料,就在 pthread create 裡面的最後 乙個引數使用傳位址呼叫 void c,否則使用傳值呼叫 void c ...