#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());
立即返回吗?
答案 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
,这可能会导致不可预测的行为。
为了避免这些问题,一个特定的事情应该控制一个线程的生命周期。这可以是线程本身,如果它是分离的,在这种情况下没有线程应该尝试加入它。它也可以是连接它的线程,在这种情况下不应该分离线程。