2010-11-21 4 views
1

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

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

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 все еще будет показывать потоки с их памятью после завершения потоков?

ответ

0

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

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

0

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

0

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

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