Linux 執行緒 二 (等待與分離)

2021-08-21 22:41:33 字數 2849 閱讀 9898

執行緒等待:

為什麼需要執行緒等待?

1.已經退出的執行緒,其空間沒有被釋放,仍然在程序的位址空間內

2.建立新的執行緒不會復用剛才退出的執行緒位址空間

我們知道程序內至少有乙個執行緒作為執行單位,當我們程序退出了,意味著我們的執行緒也退出了。但是程序內有多個執行緒時,我們只想結束掉其中的某乙個執行緒時,我們該如何做呢?系統為我們提供了下面幾種方式:

1.從執行緒函式中直接呼叫 return ,這種方法對主線程不適用,從mian函式return相當於呼叫了exit,結束掉了整個程序。

2.執行緒可以呼叫pthread——exit() 終止自己

3.乙個執行緒可以呼叫 pthread_cancel() 終止同乙個程序中的另乙個程序

看一下這兩個函式的原型:

void  pthread_exit(void

*value_ptr);

引數:value_ptr:value_ptr 不要指向乙個區域性變數

返回值:無

----------------------------

int pthread_cancel(pthread_t thread);

引數:thread(執行緒id)

返回值: 成功返回0,失敗返回錯誤碼

程序中,如果父程序沒有等待子程序返回的資訊,那麼會出現殭屍程序,而我們的執行緒也是如此。

程序中有 wait(),waitpid() 函式進行等待

執行緒中有 pthread_join()

int pthread_join(pthread_t thread, void

**value_ptr);

引數:thread(執行緒id)

value_ptr:它指向乙個指標,後者指向執行緒的返回值

返回值:成功返回0,失敗返回錯誤碼

呼叫該函式的執行緒將掛起等待,知道id為thread的執行緒終止。我們知道執行緒的退出方式有幾種,所以pthread_join() 得到的終止狀態也是不同的。

1.如果thread執行緒通過return 返回,value_ptr 所指向的單元裡存放的是thread執行緒函式的返回值

2.如果是執行緒被其他執行緒呼叫pthread_cancel() ,value_ptr所指向的單元裡存放的是常數 pthread_canceled

3.如果thread執行緒是自己呼叫pthread_exit() 終止的,value_ptr所指向的單元存放的是傳給 pthread_exit的引數

4.如果對執行緒終止狀態不感興趣,value_ptr = null

執行緒等待例項:

#include

#include

#include

#include

#include

void *thread1(void *arg)

void *thread2(void *arg)

void *thread3(void* arg)

}int main()

else

return

0;}

**結果:

執行緒分離:

joinable: 可結合的

detach:可分離的

為什麼需要執行緒分離?

1.預設情況下,新建立的執行緒是 joinable 的,執行緒退出後,需要對其進行 pthread_join 操作,否則無法釋放資源,從而造成記憶體洩露。

2.如果我們不關心執行緒的返回值,呼叫 pthread_join() 是一種負擔,這時,我們可以告訴系統,當執行緒退出時,自動的釋放執行緒的資源。

函式有兩個:

執行緒組內其他執行緒對目標執行緒進行分離:

int pthread_detach(pthread_t thread);

執行緒自己分離:

pthread_detach(pthread_self());

#include

#include

#include

#include

#include

void *thread(void *arg)

int main()

int ret = 0;

sleep(1);

if(pthread_join(tid,null) == 0) //等待,但是執行緒已經分離,資源被**了,等待失敗

else

return ret;

}

ps:

對比程序和執行緒的函式:

程序                          執行緒

pid pthread

fork() pthread_create

wait() pthread_join

殭屍程序 僵執行緒

exit pthread_exit

kill //他殺 int pthread_cancel(tid) cancel,執行緒不會立即退出,而是要等到取消點才退出

取消點:凡是系統呼叫的地方都是取消點

人為設定乙個取消點:void pthread_testcancel(void)

windows多執行緒(二) 等待執行緒返回

多執行緒程式設計中,有時我們需要等待某一線程完成了特定的操作後再繼續做其他事情,要實現這個目的,可以使用windows api函式waitforsingleobject,或者waitformultipleobjects。這兩個函式都會等待object被標為有訊號 signaled 時才返回。只要是w...

C 多執行緒初級二 等待程序

polythreaddemo.cpp 定義控制台應用程式的入口點。raii,也稱為 資源獲取就是初始化 是c 等程式語言常用的管理資源 避免記憶體洩露的方法。它保證在任何情況下,使用物件時先構造物件,最後析構物件。include stdafx.h include include include in...

10 等待執行緒死亡join方法

等待執行緒死亡 join 方法假設有三個執行緒,分別是執行緒a,執行緒b,和執行緒c他們各自的任務分別是列印數字 一 數字2和數字三,這三個執行緒同時啟動,如何讓這三個執行緒按順序執行任務,也就是按順序列印123,如果想讓多個執行緒按順序執行,可以使用thread類裡面的join方法,它的作用是等待...