pthread в объединение(ID потока, &ВИЭ), если &Рес не null - бесплатно(РЭС) нужен?


Я наткнулся на пример кода здесь. Строки, которые привлекли мое внимание (все остальные строки пропущены):

{  
...  
void *res;  
...  
s = pthread_join(tinfo[tnum].thread_id, &res);  
...  
free(res);      /* Free memory allocated by thread */  
}  

Может ли кто-нибудь глубже в pthreads, чем я, прокомментировать free(res), пожалуйста? Я должен сказать, что никогда не видел этого раньше, и что поиск в интернете в течение 1-1, 5 часов не дал мне никаких других подобных примеров.

1 2

1 ответ:

В pthread_join(thread_id, &res), если &res не равно NULL-свободен (res) нужна?

Это зависит от того, было ли возвращаемое значение потока динамически выделено (с помощью malloc() & co).

Если вы посмотрите на функцию thread_start() на той же странице, вы увидите, что она имеет оператор return:

return uargv;

И uagrv было выделено:

       uargv = strdup(tinfo->argv_string);

Следовательно, вызов free() используется в main() после вызова pthread_join(). Потому что res - это заполненный uargv (возвращаемый нитка). Вы можете концептуально предположить, что внутри функции pthread_join() есть такой код:

 if (res)
   *res = uargv;

Вот он выделен с помощью strdup() (который внутренне выделяет память). Так что Вы free() это. Если поток просто имеет return NULL; (и свободен () сам по себе uargv), то вам не нужно free().

Общий ответ заключается в том, что если вы выделяете что-то с помощью функций семейства malloc(), то вам нужно free().