Есть ли недопустимый идентификатор pthread_t?

Я хотел бы вызвать 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. Нет. Однако присоединение к ранее присоединенному потоку - это неопределенное поведение. Теперь предположим, что указанная выше «функция» вызывается повторно.Безусловный вызов pthread_join и проверка результата может привести к вызову pthread_join в ранее присоединенном потоке.

51
задан shodanex 8 June 2011 в 00:22
поделиться