如果线程在其他线程等待它(加入)之前退出怎么办?

What if thread exit before other thread wait for it(join)?

例如,如果我创建 3 个线程并以相同的顺序加入它们。如果第二个线程先退出,那么 pthread_join 会发生什么。程序会阻塞直到 tid1 退出还是直接从 pthread_join(&tid2,NULL) return?

   pthread_t tid1,tid2,tid3;
   pthread_create(&tid1, NULL, SomeFun, NULL);
   pthread_create(&tid2, NULL, SomeFun, NULL);
   pthread_create(&tid3, NULL, SomeFun, NULL);
   pthread_join(&tid1, NULL);
   pthread_join(&tid2, NULL);
   pthread_join(&tid3, NULL);

如果您加入一个已经结束的线程,pthread_join 将立即 return(并像往常一样销毁线程对象)。

当您编码调用时:

pthread_join(&tid1, NULL);

如果 tid1 尚未退出,则该调用将阻塞直到退出。如果 tid2 同时退出,则不会更改此特定调用的行为。但在那种情况下,当调用执行 return 时,下一个调用:

pthread_join(&tid2, NULL);

将立即 return,因为 tid2 已经退出。

如果您想在任意线程完成后立即执行某些工作,则需要使用 pthread_join() 以外的其他方式与 "some thread is finished" 事件同步。也许等待一个条件变量,该变量在每个线程完成时都会发出信号(以及一些机制,例如队列,以便等待线程可以确定哪个线程已发出完成信号)。可以使用的另一种机制是让线程将信息写入主(或控制)线程读取的管道以获取该通知。