如果线程在调用 pthread_join 之前退出怎么办

What if thread exits before calling pthread_join

我有小码

void *PrintHello(void *threadid)
{
   cout<<"Hello"<<endl;
   pthread_exit(NULL);
}

int main ()
{
   pthread_t threads_id;
   pthread_create(&threads_id, NULL, PrintHello, NULL);
   int i=0;
   for(;i<100;i++){cout<<"Hi"<<endl;}   
   pthread_join(threads_id,NULL);
   return 0;
}

我会在创建后的某个时间加入线程。如果 main 试图加入一个已经退出的线程会发生什么?

What will happen if the main tries to join a thread which already exited?

加入操作将立即完成,return。

技术上有多种可能的行为。

如果您在线程结束后不久加入线程,句柄可能仍然有效,pthread_join 应立即 return。

如果线程在调用 pthread_join 之前完全结束,thread_t 句柄将不再有效,它应该 return 失败 ESRCH

在非常非常非常极端的情况下,如果你加入一个很久以前就死掉的线程,这样的句柄可以被重用,而你正在加入一个不同的线程。

TL;DR:进行适当的同步(例如退出标志)并检查 returned 错误。