Pthreads, путаница с pthread_join (pthread_t, void **)

Я не могу понять почему pthread_join принимает в качестве второго аргумента void** для возвращаемого значения, тогда как pthread_exit, которому дается возвращаемое значение, имеет аргумент возвращаемого значения как void*,

2

Решение

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
}
4

Другие решения

По существу, pthread_join() хочет вернуть две порции информации:

  • индикация успеха / неудачи
  • все, что вернул поток (который имеет тип void*)

В Си типичный способ, которым функция «возвращает» два отдельных значения, состоит в том, чтобы функция возвращала одно из этих значений в обычном порядке и «возвращала» другое значение в местоположении, предоставленном вызывающей стороной, где вызывающая сторона передает указатель на это местоположение. , Так pthread_join():

  • возвращает успех / неудачу как значение функции
  • возвращает поток void* привести к предоставлению вызывающего местоположения, что вызывающий передает void** к.

Обратите внимание, что в pthread_join()В случае, местоположение вызывающего абонента не является обязательным. NULL может быть передано в id, вызывающий не заинтересован в этом результате. Сделать местоположение, предоставляемое вызывающим абонентом, необязательным, отнюдь не универсальный, идиома.

pthread_exit() не нужно использовать void** как аргумент, потому что этот аргумент не является результат функции. Так что он может просто принять значение напрямую.

2

По вопросам рекламы [email protected]