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

时间:2016-04-22 00:00:10

标签: c multithreading unix pthreads pthread-join

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

   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);

2 个答案:

答案 0 :(得分:1)

如果您加入已经结束的线程,pthread_join将立即返回(并像通常那样销毁线程对象)。

答案 1 :(得分:1)

编码电话时

pthread_join(&tid1, NULL);

如果tid1尚未退出,那么该调用将会阻止,直到它出现。如果tid2在此期间退出,则不会改变此特定呼叫的行为。但在那种情况下,当呼叫确实返回时,下一个呼叫:

pthread_join(&tid2, NULL);

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

如果要在任意线程完成时立即执行某些工作,则需要使用pthread_join()之外的其他内容来与“某个线程已完成”事件同步。也许等待一个条件变量,当它们完成时由每个线程发出信号(以及一些机制,如队列,以便等待的线程可以确定哪个线程已经发出完成信号)。可以使用的另一种机制是让线程将信息写入主(或控制)线程读取的管道以获取该通知。

相关问题