7

我有一个小代码

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

4

2 回答 2

9

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

加入操作将立即完成并返回。

于 2015-03-28T07:36:26.123 回答
4

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

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

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

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

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

于 2015-03-28T07:54:56.217 回答