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().