如果线程在调用 pthread_join 之前退出怎么办
What if thread exits before calling 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;
}
我会在创建后的某个时间加入线程。如果 main 试图加入一个已经退出的线程会发生什么?
What will happen if the main tries to join a thread which already exited?
加入操作将立即完成,return。
技术上有多种可能的行为。
如果您在线程结束后不久加入线程,句柄可能仍然有效,pthread_join
应立即 return。
如果线程在调用 pthread_join
之前完全结束,thread_t
句柄将不再有效,它应该 return 失败 ESRCH
。
在非常非常非常极端的情况下,如果你加入一个很久以前就死掉的线程,这样的句柄可以被重用,而你正在加入一个不同的线程。
TL;DR:进行适当的同步(例如退出标志)并检查 returned 错误。
我有小码
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;
}
我会在创建后的某个时间加入线程。如果 main 试图加入一个已经退出的线程会发生什么?
What will happen if the main tries to join a thread which already exited?
加入操作将立即完成,return。
技术上有多种可能的行为。
如果您在线程结束后不久加入线程,句柄可能仍然有效,pthread_join
应立即 return。
如果线程在调用 pthread_join
之前完全结束,thread_t
句柄将不再有效,它应该 return 失败 ESRCH
。
在非常非常非常极端的情况下,如果你加入一个很久以前就死掉的线程,这样的句柄可以被重用,而你正在加入一个不同的线程。
TL;DR:进行适当的同步(例如退出标志)并检查 returned 错误。