У меня есть небольшой код
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;
}
Я присоединяюсь к теме через некоторое время после создания. Что произойдет, если основной попытается присоединиться к потоку, который уже вышел?
Что произойдет, если основной попытается присоединиться к потоку, который уже вышел?
Операция соединения немедленно завершится и вернется.
Технически существует несколько возможных вариантов поведения.
Если вы присоединяетесь к потоку вскоре после его смерти, дескриптор все еще может быть действительным и pthread_join
должен вернуться немедленно.
Если поток полностью закончился до вызова pthread_join
, thread_t
дескриптор больше не действителен и должен возвращать ошибку с ESRCH
,
В очень, очень экстремальном случае, если вы присоединяетесь к потоку, который давно был мертв, такой дескриптор может быть использован повторно, и вы присоединяетесь к другому потоку.
TL; DR: выполнить правильную синхронизацию (например, флаги выхода) и проверить наличие ошибок.