2014-12-03 44 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

相关问题