例如,如果我创建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);
答案 0 :(得分:1)
如果您加入已经结束的线程,pthread_join
将立即返回(并像通常那样销毁线程对象)。
答案 1 :(得分:1)
:
pthread_join(&tid1, NULL);
如果tid1
尚未退出,那么该调用将会阻止,直到它出现。如果tid2
在此期间退出,则不会改变此特定呼叫的行为。但在那种情况下,当呼叫确实返回时,下一个呼叫:
pthread_join(&tid2, NULL);
将立即返回,因为tid2
已经退出。
如果要在任意线程完成时立即执行某些工作,则需要使用pthread_join()
之外的其他内容来与“某个线程已完成”事件同步。也许等待一个条件变量,当它们完成时由每个线程发出信号(以及一些机制,如队列,以便等待的线程可以确定哪个线程已经发出完成信号)。可以使用的另一种机制是让线程将信息写入主(或控制)线程读取的管道以获取该通知。