[英]pthread_detach question
直到最近,我的印象是,如果你在產生線程后“分離”一個線程,那么即使在“主”線程終止之后線程仍然存在。
但是一個小實驗(如下所列)與我的觀點相反。 我希望分離的線程繼續打印“從分離的線程說話”,即使在主要終止之后,但這似乎並沒有發生。 該應用程序顯然終止了......
“主要”問題返回0后,“分離”線程是否死亡?
#include <pthread.h>
#include <stdio.h>
void *func(void *data)
{
while (1)
{
printf("Speaking from the detached thread...\n");
sleep(5);
}
pthread_exit(NULL);
}
int main()
{
pthread_t handle;
if (!pthread_create(&handle, NULL, func, NULL))
{
printf("Thread create successfully !!!\n");
if ( ! pthread_detach(handle) )
printf("Thread detached successfully !!!\n");
}
sleep(5);
printf("Main thread dying...\n");
return 0;
}
引用Linux程序員手冊 :
分離屬性僅在線程終止時確定系統的行為; 如果進程使用
exit(3)
終止(或等效地,如果主線程返回),它不會阻止線程終止。
同樣來自Linux程序員手冊 :
要允許其他線程繼續執行,主線程應該通過調用
pthread_exit()
而不是exit(3)
來終止。
pthread_detach
只是意味着你永遠不會再次加入線程。 這允許pthread庫知道一旦線程退出(分離的情況)它是否可以立即處置線程資源,或者它是否必須保留它們,因為您可能稍后在線程上調用pthread_join
。
一旦主要返回(或退出),操作系統將收獲所有線程並破壞您的進程。
pthread_detach
不會按照您的想法執行操作 - 它向實現指示具有指定ID的線程正在使用的空間可以在它終止后立即回收,即。 不會對它執行pthread_join
操作。
一旦包含它們的進程終止,所有線程都將終止。
是的,分離的線程將在return 0
后死亡。
從man pthread_detach
的NOTES部分
分離屬性僅在線程終止時確定系統的行為; 如果進程使用exit(3)終止(或等效,如果主線程返回),它不會阻止線程終止
來自man pthread_detach
:
pthread_detach()
函數將線程標識的線程標記為已分離。 當分離的線程終止時,其資源會自動釋放回系統,而不需要另一個線程與終止的線程連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.