Я бы назвал pthread_join для данного идентификатора потока, но только если этот поток был запущен. Безопасное решение может заключаться в том, чтобы добавить переменную, чтобы отслеживать, какой поток был запущен или нет. Однако мне интересно, возможно ли проверять переменные pthread_t, что-то вроде следующего кода.
pthread_t thr1 = some_invalid_value; //0 ?
pthread_t thr2 = some_invalid_value;
/* thread 1 and 2 are strated or not depending on various condition */
....
/* cleanup */
if(thr1 != some_invalid_value)
pthread_join(&thr1);
if(thr2 != some_invalid_value)
pthread_join(&thr2);
Где some_invalid_value может быть 0 или макрос PTHREAD_INVALID_ID, зависящий от реализации
PS: Мое предположение заключается в том, что типы pthread_t сопоставимы и присваиваются, предположение основано на
PPS: Я хотел сделать это, потому что я думал, что вызов pthread_join на недопустимом идентификаторе потока был undefinde. Это не. Тем не менее, соединение ранее связанного потока IS undefined. Теперь предположим, что вышеуказанная "функция" вызывается многократно. Необычно вызов pthread_join и проверка результата могут привести к вызову pthread_join в ранее соединенном потоке.