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 ответ:
В 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()
.