2015-10-20 6 views
3

поток в моей программе вызывает pthread_join(thread_id, nullptr); 2 раза за то же thread_id из той же вызывающей нити., соединяющий один и тот же pthread несколько раз

Первый раз вызов возвращается успешно, но во второй раз он просто висит бесконечно. В документации четко не указано, что запретить вызывать pthread_join несколько раз для одного и того же thread_id. Это действительно так?

Я знаю, что я могу реализовать синхронизацию потока с помощью pthread_cond_t, но сначала хочу понять ограничения pthread_join.

+3

Это не имеет смысла: 'pthread_join' возвращается, когда поток, соединенный с ним, закончился. Поток не может заканчиваться более одного раза ... Кроме того: [man page] (http://linux.die.net/man/3/pthread_join) гласит: * Соединение с потоком, который ранее был присоединен, приводит к Неопределенное поведение. * – Kninnug

+0

В документации четко указано: «Если этот поток уже завершен, то pthread_join() немедленно возвращается». Так что имеет смысл, если разные части программы заинтересованы проверить, завершился ли их дочерний процесс. – Roman

+3

@ Roman: «уже завершенные, но еще не присоединившиеся» и «уже присоединившиеся» - это совершенно разные вещи. ** Любое ** использование 'pthread_t' после' pthread_join' на нем является чрезвычайно опасным неопределенным поведением (это ошибка типа after-free). –

ответ

3

Посмотрите на documentation for pthread_join - в разделе Примечания утверждается, что:

Соединение с резьбой, который ранее был присоединен результаты к неопределенному поведению.

В ссылке также содержится много другой полезной информации о присоединении потоков (и других аспектов, если вы ищете некоторые другие функции pthread).

+0

Спасибо! Я не могу поверить, что я пропустил эту линию :( – Roman

Смежные вопросы