2016-03-03 3 views
2

Я наткнулся на пример кода here. Линии, которые привлекли мое внимание (все остальные строки пропущено):pthread_join (thread_id, & res), если & res не NULL - бесплатно (res) необходимо?

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

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

ответ

2

В pthread_join (thread_id, & Рез), если & разрешением не NULL - бесплатно (разрешение) заблокированные?

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

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

return uargv; 

и uagrv выделялась:

 uargv = strdup(tinfo->argv_string); 

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

if (res) 
    *res = uargv; 

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

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

+0

удалено, сражаясь с двигателем;) –

+0

Благодарим вас за быстрый ответ. Я пропустил strdup() (или, скорее, автоматически преобразовал его в alloca() во время чтения, хотя alloca() не может использоваться для этой цели). Вы на самом деле дали мне новое направление в мышлении ... Я почему-то предполагал, что как только поток (правильно) завершен, его ресурсы автоматически освобождаются системой (с некоторыми явно указанными в исключениях man-страниц). –

+0

Благодарим вас за быстрый ответ. Я пропустил strdup(). Вы на самом деле дали мне новое направление в мышлении. Я предположил, что как только поток (правильно) завершен, его ресурсы автоматически освобождаются системой (с некоторыми явно указанными в man-страницах исключениями) .: «Если поток является соединяемым, то другой поток может вызывать pthread_join (3) дождаться окончания потока и получить его статус выхода. Только когда соединение с завершенным объединенным соединением связано с последними из его ресурсов, выпущенных обратно в систему ». –

 Смежные вопросы

  • Нет связанных вопросов^_^