Вопросы аллокаторов памяти в последнее время стали трендом, а у меня опять нарисовалась старая проблема с псевдо-утечками.
Вот кусок кода:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void *thread_func(void *p) {
void *ptr;
printf("thread %p started\n", p);
ptr = malloc(355);
sleep(1);
free(ptr);
printf("thread %p terminated\n", p);
return NULL;
}
int main(void) {
pthread_t t[1000];
int k;
for (k = 0; k < 1000; k ++)
pthread_create(&t[k], NULL, thread_func, (void *)(size_t)k);
sleep(1000);
for (k = 0; k < 1000; k ++)
pthread_join(t[k], NULL);
return 0;
}
который создаёт много нитей. У меня на 64-битной коробке эта программа выделяет 11g виртуальной памяти, которая не освобождается, когда нити завершаются.
Раньше я решал эту проблему, просто ограничивая число создаваемых нитей, но это не всегда удобно делать. Особенно в случае, если число создаваемых нитей не известно заранее. Может есть какой способ вернуть системе память, выделенную под арену для завершённой нити? Она ведь нити больше не понадобится.
Решение. Выяснилось, что pthread_detach вполне достаточно, если не создавать много нитей одновременно.