我有一个小代码
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;
}
我在创作后的某个时候加入了这个帖子。如果主要尝试加入已经退出的线程会发生什么?
答案 0 :(得分:9)
如果主要尝试加入已经退出的线程会发生什么?
联接操作将立即完成并返回。
答案 1 :(得分:2)
从技术上讲,有多种可能的行为。
如果您在线程死亡后不久加入该线程,则该句柄可能仍然有效,pthread_join
将立即返回。
如果线程在调用pthread_join
之前完全结束,则thread_t
句柄不再有效,并且应该使用ESRCH
返回失败。
在非常非常极端的情况下,如果你加入一个很久以前已经死的线程,这样的句柄可以被重用,你正在加入一个不同的线程。
TL; DR:进行适当的同步(例如退出标志)并检查返回的错误。