如果一个被等待的线程分离自己怎么办?

时间:2014-12-03 03:03:49

标签: c linux multithreading pthreads posix

#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());立即返回吗?

2 个答案:

答案 0 :(得分:4)

行为未定义,因此显然要不惜一切代价避免。

(据我所知,行为是隐式未定义。explicitly undefined behavior in the spec有几个类似的实例,但没有提到这个确切的情况。)

好奇的是,在我附近的NPTL Linux系统上,pthread_detach()pthread_join()都返回0,而且后者阻塞并成功获取线程返回的值。相反,在我附近的OS X系统上,pthread_detach()成功,而pthread_join()立即失败,并带有ESRCH。

答案 1 :(得分:1)

您的代码有问题。当您调用pthread_join时,该线程可能已经终止。由于它已分离,pthread_t不再有效。因此,您的代码可能会将无效pthread_t传递给pthread_join,这可能会导致不可预测的行为。

为了避免这些问题,一个特定的事情应该控制一个线程的生命周期。这可以是线程本身,如果它是分离的,在这种情况下没有线程应该尝试加入它。它也可以是连接它的线程,在这种情况下不应该分离线程。