執行緒等待:
為什麼需要執行緒等待?
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方法,它的作用是等待...