LINUX.ORG.RU

Завершение потока: остается занятая память.


0

0

Добрый день!
Подскажите, пожалуйста, почему в нижеприведенном примере
после завершения потока остается занятая память?

m0 == 0
m1 == 144

С уважением.


#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <malloc.h>

static void * threadfunc( void * prm )
{
// pthread_detach( pthread_self() );
sleep(1);
return NULL;
}

int main( int argc, char **argv )
{
int rc, m0, m1;
void * t_rc;
pthread_t thread;
struct mallinfo mi;

mi = mallinfo(); m0 = mi.uordblks;
printf( "m0 == %d\n", m0 );

if( 0 != (rc = pthread_create( &thread, NULL, threadfunc, NULL ) )) {
printf( "pthread_create: %s\n", strerror( rc ) );
thread = 0;
}
if( thread ) {
if( 0 != (rc = pthread_join( thread, NULL ))) {
printf( "pthread_join: %s\n", strerror( rc ) );
}
}

mi = mallinfo(); m1 = mi.uordblks;
printf( "m1 == %d\n", m1 );
return 0;
}


есть мнение что в конце функции threadfunc надо делать pthread_exit(NULL);

ЗЫ: ну где анонимусы :(

PIn
()
Ответ на: комментарий от PIn

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

vyp08
() автор топика
Ответ на: комментарий от PIn

Что-то я заработался совсем, извините. После замены "return NULL;" на "pthread_exit(NULL);":

m0 == 0 m1 == 1104

вышеозвученное мнение, IMHO, ошибочно.

PS. Или что-то я не так понял?

vyp08
() автор топика

На лик это не похоже. Если приведённый выше код create/join прогнать в цикле несколько раз, объем занятой памяти не изменяется. Скорее всего, это оптимизация NPTL, для ускорения повторного создания треда.

DrLivsy
()
Ответ на: комментарий от xydo

Да, я пришел к тем же выводам. Спасибо за ответ.

vyp08
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.