2014-12-03 45 views
2
#include <pthread.h> 

void thread_routine(void*) 
{ 
    sleep(5); 
    pthread_detach(pthread_self()); 
    sleep(5); 
} 

int main() 
{ 
    pthread_t t; 
    pthread_create(&t, 0, thread_routine, 0); 
    pthread_join(t); 
} 

pthread_join(t);pthread_detach(pthread_self());成功後立即返回?如果被等待的線程自行分離,該怎麼辦?

+1

我的猜測,就像在調用pthread_join之前線程被分離一樣:UB。 – Deduplicator 2014-12-03 03:19:05

回答

4

行爲是不確定的,因此顯然要不惜一切代價避免。

(據我可以告訴的行爲是隱含不確定的。還有的explicitly undefined behavior in the spec幾個親屬的情況下,但這個確切的方案未提及。)

對於好奇,一個NPTL Linux系統上靠近我,pthread_detach()pthread_join()返回0,此外,後者阻止併成功獲取該線程返回的值。在我附近的OS X系統上,相反,pthread_detach()成功,pthread_join()立即失敗並顯示ESRCH。

1

你的代碼是越野車。當您撥打pthread_join時,該線程可能已經終止。由於它已分離,因此pthread_t不再有效。因此,您的代碼可能會傳遞無效pthread_tpthread_join,這可能會導致不可預知的行爲。

爲了避免這些問題,一個特定的事情應該控制一個線程的生命週期。這可以是線程本身,如果它是分離的,在這種情況下,沒有線程應該嘗試加入它。它也可以是加入它的線程,在這種情況下線程不應該被分離。

+2

這是所有真實的和偉大的指導,但是是關鍵點。 OP的問題是,如果作爲連接目標的線程在連接過程中自行分離,會發生什麼?的確,'sleep()'是傻瓜的同步黃金,並且OP的'thread_routine'''可以在'main'線程調用join之前終止它的10秒生命。然而,在實踐中,這個帖子是@xmllmx提出的一個很好的方法,你不會直接回答。 – pilcrow 2014-12-03 19:43:34

+0

我會說,在這種情況下,它歸結爲可以在pthread_t上同時調用哪些函數。 – 2014-12-03 19:47:49

+1

@pilcrow無論您如何創建比賽,答案都是一樣的。行爲是不可預知的,因爲你不能保證'pthread_t'仍然有效。 – 2014-12-03 19:52:30

相關問題