Что делать, если поток завершает работу перед вызовом 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;
}

Я присоединяюсь к теме через некоторое время после создания. Что произойдет, если основной попытается присоединиться к потоку, который уже вышел?

3

Решение

Что произойдет, если основной попытается присоединиться к потоку, который уже вышел?

Операция соединения немедленно завершится и вернется.

8

Другие решения

Технически существует несколько возможных вариантов поведения.

Если вы присоединяетесь к потоку вскоре после его смерти, дескриптор все еще может быть действительным и pthread_join должен вернуться немедленно.

Если поток полностью закончился до вызова pthread_join, thread_t дескриптор больше не действителен и должен возвращать ошибку с ESRCH,

В очень, очень экстремальном случае, если вы присоединяетесь к потоку, который давно был мертв, такой дескриптор может быть использован повторно, и вы присоединяетесь к другому потоку.

TL; DR: выполнить правильную синхронизацию (например, флаги выхода) и проверить наличие ошибок.

2

По вопросам рекламы [email protected]