如果线程在调用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试图加入一个已经退出的线程,会发生什么?

如果main试图加入一个已经退出的线程,会发生什么?

联接操作将立即完成并返回。

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

如果在线程死后不久加入线程,则句柄可能仍然有效,并且pthread_join将立即返回。

如果线程在调用pthread_join之前完全结束,则thread_t句柄将不再有效,并且应该返回失败的ESRCH

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

TL;DR:进行正确的同步(例如退出标志)并检查返回的错误。

最新更新