如果线程在调用pthread_join之前退出会怎么样?

InQ*_*ive 4 c c++ pthreads 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;
}
Run Code Online (Sandbox Code Playgroud)

我在创作后的某个时候加入了这个帖子.如果主要尝试加入已经退出的线程会发生什么?

orl*_*rlp 8

如果主要尝试加入已经退出的线程会发生什么?

连接操作将立即完成并返回.


Non*_*upt 5

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

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

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

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

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

  • 如果线程是可加入的,则在有人加入之前,ID 将不会(也不能)被重用。因此,相反,不加入可加入线程是不好的,因为为线程保留的资源永远不会被释放。 (3认同)