Стек отдельных потоков никогда не выпускается - PullRequest
1 голос
/ 21 ноября 2010

Я сталкиваюсь с ситуацией, когда потоки, которые я создаю отделяемыми, не освобождают свою память после того, как они вышли.

Я попытался создать потоки следующими способами

1-

pthread_attr_setdetachstate(&pthread_attributes, PTHREAD_CREATE_DETACHED);
pthread_create(&thread_id, &pthread_attributes, establish_connection,
               (void *) establish_connection_arguments);

2-

pthread_create(&thread_id, &pthread_attributes, establish_connection,
               (void *) establish_connection_arguments);
pthread_detach(thread_id);

3-

pthread_create(&thread_id, &pthread_attributes, establish_connection,
               (void *) establish_connection_arguments);

void *establish_connection(void *arguments) {
    pthread_detach(pthread_self());
    return NULL;
}

Я уверен, что память все еще сохраняется,как pmap подтверждает это.

Это нормальное поведение, что pmap будет по-прежнему показывать потоки с их памятью после завершения потоков?

Ответы [ 3 ]

0 голосов
/ 21 ноября 2010

Скорее всего, пространство кэшируется любым используемым распределителем памяти. Запуск нечетного потока и отсутствие использования памяти впоследствии не является признаком утечки - вам придется многократно открывать и закрывать много потоков, а затем проверять использование памяти процесса.

0 голосов
/ 31 августа 2011

Программа pmap показывает вам карту памяти процесса.Эта память все еще используется процессом.Например, если создан другой поток, эта память может использоваться для его стека.

0 голосов
/ 21 ноября 2010

По умолчанию glibc / nptl кэширует потоки стеков, чтобы использовать их повторно. Это влечет за собой небольшую стоимость синхронизации для добавления / удаления элементов из списка кэша и нетривиальную (но, надеюсь, небольшую) стоимость памяти, но позволяет избежать затрат на вызовы mmap и munmap каждый раз, когда поток создается или уничтожается. Я не подозреваю, что есть способ изменить это поведение по умолчанию без очень хрупких хаков.

Редактировать: Так как вы сказали, что освобождаются объединяемые потоки, вот мое второе предположение по причине: для реализации очень трудно заставить поток освободить свой собственный стек, так как у него не было бы стека бежать во время выполнения работы, чтобы освободить свой стек. Можно обойти это ограничение, написав asm, для которого не требуется стек для выполнения системного вызова munmap, за которым сразу следует самоотключение, но я никогда не видел, чтобы реализация делала это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...