как pthread_join заполняет переменную thread_result - PullRequest
2 голосов
/ 08 июля 2011

Примечание: я удалил все необходимые проверки ошибок в следующем фрагменте.

...
void *thread_function(void *arg)
{
   ...
   pthread_exit("Hello");
}

pthread_t a_thread;
void *thread_result;

pthread_create(&a_thread, NULL, thread_function, NULL);
pthread_join(a_thread, &thread_result);
/*

int pthread_join(pthread_t th, void **thread_return);
The second argument is a pointer to a pointer that itself points to the return
value from the thread.

int pthread_exit(void *retval);
This function terminates the calling thread, returning a pointer to an object which
cannot be a local variable.

*/

Вопрос : как pthread_join заполняет переменную thread_result? Поскольку переменная thread_result не имеет выделенного пространства для хранения информации, если pthread_join выделяет место для thread_result, то основной поток должен освободить ресурс, удерживаемый с помощью varable. Как видите, код не включите ресурс освобождения thread_result. Итак, я предполагаю, что pthread_join фактически не выделяет место для thread_result.

Теперь новый вопрос - как переменная thread_result может содержать информацию без выделяется какое-то место?

// Update-1: добавить определение pthread_exit.

// Update-2: добавить определение функции thread_function.

Ответы [ 5 ]

3 голосов
/ 08 июля 2011

Ваш вывод верен: pthread_join не выделяет память для результата.

На самом деле все очень просто:

  • pthread_exit предоставляется (void*) указатель на результат самим потоком; решать, откуда взялся этот указатель, решать самим.
  • Впоследствии pthread_join - вызывается из другого потока - сохраняет этот указатель в переменной, на которую указывает его второй аргумент.

Что касается результата, все, что pthreads делает, это передает указатель через границы потоков. Приложение должно гарантировать, что указанная память освобождается таким образом, чтобы это соответствовало тому, как она была распределена.

2 голосов
/ 08 июля 2011

Ну, pthread_join ничего не выделяет. У вас есть функция потока

void *thread_fun(void *arg)
{
    /* stuff */


    return something;
}

Затем наступает pthread_join и до его возвращения

if (NULL != value_ptr) {
    *value_ptr = return_value; /* What you returned from your function. */
}

Так что функция потока должна распределять вещи.

2 голосов
/ 08 июля 2011

thread_result - это просто указатель на данные, которые возвращает thread_function.Если thread_function возвращает int приведение к void *, поток, вызывающий pthread_join, должен знать об этом и рассматривать thread_result как int.Если, с другой стороны, thread_function возвращает указатель на выделенную память, поток, вызывающий pthread_join, должен знать об этом и в конечном итоге освободить память.

В вашем примере, где thread_function возвращает строковый литерал, thread_result будет указателем на строковый литерал.Это то же самое:

 const char *str = "Hello";

Строковые литералы обычно располагаются в разделе данных, поэтому их не следует освобождать.

0 голосов
/ 08 июля 2011

Ну, thread_result представляется объявленным как указатель. Указатель не нуждается в выделенном пространстве для хранения информации. Указатель будет указывать на адрес памяти, возвращаемый из pthread_join.

И что более важно, вы должны неправильно распределить результат, который вы собираетесь вернуть в конце функции thread_file, в противном случае память кучи исчезнет.

Некоторое время спустя вам, в конечном счете, придется освободить пространство памяти, выделенное там, куда указывает thread_result.

...