Я не могу понять почему pthread_join
принимает в качестве второго аргумента void**
для возвращаемого значения, тогда как pthread_exit
, которому дается возвращаемое значение, имеет аргумент возвращаемого значения как void*
,
pthread_join ожидает окончания потока, а результирующее значение из pthread_exit сохраняется в * value_ptr. Если вы хотите проигнорировать результат, вы можете передать NULL для value_ptr. Это обычная практика C для имитации передачи по ссылке путем передачи указателя на переменную. Увидеть Проходя по ссылке в С
Pthread_join возвращает 0 в качестве значения, возвращаемого функцией в случае успеха; тогда вы знаете, что поток был присоединен, и вы можете получить доступ к значению из * value_ptr.
void *value = NULL;
if (pthread_join(thread, &value) == 0) {
// thread has ended, and the exit value is available in
// the value variable
}
По существу, pthread_join()
хочет вернуть две порции информации:
void*
)В Си типичный способ, которым функция «возвращает» два отдельных значения, состоит в том, чтобы функция возвращала одно из этих значений в обычном порядке и «возвращала» другое значение в местоположении, предоставленном вызывающей стороной, где вызывающая сторона передает указатель на это местоположение. , Так pthread_join()
:
void*
привести к предоставлению вызывающего местоположения, что вызывающий передает void**
к. Обратите внимание, что в pthread_join()
В случае, местоположение вызывающего абонента не является обязательным. NULL может быть передано в id, вызывающий не заинтересован в этом результате. Сделать местоположение, предоставляемое вызывающим абонентом, необязательным, отнюдь не универсальный, идиома.
pthread_exit()
не нужно использовать void**
как аргумент, потому что этот аргумент не является результат функции. Так что он может просто принять значение напрямую.