Если поток отменяется (до его нормального завершения), то при присоединении к нему вы получите PTHREAD_CANCELED
в качестве значения возврата / состояния выхода потока. Этот макрос расширяется до фактического значения void *
, которое возвращается, так что вы можете сравнить полученное вами значение непосредственно с этим значением, чтобы определить, был ли поток отменен. Обычно это не действительный указатель, поэтому вы не должны пытаться разыменовать его.
Пример:
void *status;
// ...
if (pthread_join(t_id, &status) != 0) {
// pthread_join failed
} else if (status == PTHREAD_CANCELED) {
// successfully joined a thread that was cancelled
// 'status' MUST NOT be dereferenced
} else {
// successfully joined a thread that terminated normally
// whether 'status' may be dereferenced or how else it may be
// used depends on the thread
}
Стоит отметить, что формулировка * Страница справочника 1035 * немного быстрая и свободная. Потоки не имеют «состояния выхода» в том смысле, в каком они существуют в процессах, а фактические спецификации POSIX не используют этот термин в контексте потоков. Например, спецификации POSIX для pthread_join()
говорят:
При возврате из успешного вызова pthread_join()
с аргументом, отличным от NULL value_ptr
, значение передается в pthread_exit()
завершающим потоком должен быть доступен в месте, указанном value_ptr
.
Это немного глоток по сравнению с формулировкой Linux, но он выбран очень точный.
Обратите внимание, что выбор типа void *
здесь является намеренным и полезным. Это не просто тупой способ упаковки int
. С помощью такого указателя поток может предоставить доступ к объекту любого типа, что может быть полезно для передачи информации о результате его вычислений. С другой стороны, потоки довольно часто отказываются от этой возможности и просто возвращают NULL
. Но если поток действительно хочет предоставить целочисленный код таким способом, то он, скорее всего, предоставит int
значение приведение к типу void *
, а не указатель на объект типа int
содержащий выбранное значение. В этом случае можно получить значение, приведя обратно к int
, а не разыменовав указатель.