Вызов pthread_join для pthread_t, который мог не быть создан

У нас есть класс с защищенной переменной pthread_t. Как только этот класс создан, pthread_t существует, но ему не назначен ID, что и делает pthread_create.

Можно ли в этом случае вызывать pthread_join для переменной pthread_t?

Если я правильно понимаю справочную страницу для pthread_join, она должна вернуть ошибку ESRCH, но эту справочную страницу можно интерпретировать по-разному.


person Lieuwe    schedule 12.01.2016    source источник
comment
Откуда вы знаете, что ваша переменная pthread_t не содержит идентификатор созданного потока, из-за чего вызывающий объект ожидает не тот поток?   -  person Andrew Henle    schedule 12.01.2016
comment
Хорошая точка зрения. Каким-то образом я предположил, что pthread_t будет создан, а идентификатор инициализирован с идентификатором, который был 0/невозможен. Можно ли посмотреть pthread_t и проверить, установлен ли идентификатор?   -  person Lieuwe    schedule 12.01.2016
comment
Можно ли просмотреть pthread_t и проверить, был ли установлен идентификатор? Вы можете использовать отладчик или создать сообщение журнала определенного типа со значением идентификатора. Как вы инициализируете значение?   -  person Andrew Henle    schedule 12.01.2016
comment
Я не знаю, как он инициализируется. Pthread_create устанавливает этот идентификатор в соответствии с справочной страницей. Я просто пытаюсь не носить с собой «инициализированный» флаг. Если я могу вызвать pthread_join для pthread_t, который не использовался вместе с pthread_create, то это здорово. Если я могу каким-то образом посмотреть на объект pthread_t и проверить, был ли он «создан», то это тоже хорошо.   -  person Lieuwe    schedule 12.01.2016
comment
Ваше значение pthread_t должно начинаться с некоторого значения - оно либо неопределенно, либо инициализировано до определенного значения.   -  person Andrew Henle    schedule 13.01.2016


Ответы (1)


pthread_t — это не что иное, как unsigned long int, поэтому при объявлении инициализируйте его значением 0. Теперь непосредственно перед pthread_join просто проверьте, не равно ли оно нулю. Если оно равно нулю, то pthread_create не вызывается.

person arun pal    schedule 30.08.2018