LINUX.ORG.RU

Странности с pthread


0

0

Разъясните пожалуйста один момент. Есть код:

void* MA_ClientRouteProc(void* param)
{
    -.-.-.-.-.-.-.-.-.-.-.-
    return 0;
}

if (!pthread_create(&th, 0, MA_ClientRouteProc, param))
{
    -.-.-.-.-.
}
И вот при такой конструкции при каждом запуске потока теряется вирт. память. т.е. htop показывает что на 8 метров становится меньше вирт. памяти. При этом поток завершается удачно. strace показал:
[pid 21925] mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_32BIT, -1, 0) = 0x43040000
[pid 21925] mprotect(0x43040000, 4096, PROT_NONE) = 0
[pid 21925] clone(Process 21926 attached child_stack=0x43840250, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x438409e0, tls=0x43840950, child_tidptr=0x438409e0) = 21926
-.-.-.-.-.-.-.-.-.-.
[pid 21926] _exit(0)                    = ?
Process 21926 detached
т.е. как видно как раз и было выделено 8 метров памяти через mmap под стек. Но после завершения потока почему-то эта память не освободилась, и нигде не было munmap.
В чем может быть ошибка? или это такое специфическое поведение системы.


ЕМНИП, чтобы освободились все ресурсы, занятые потоком, либо надо дождаться его завершения с помощью pthread_join, либо заранее пометить с помощью pthread_detach.

Deleted
()

Во-первых, нити бывают двух видов: detached и joinable. Для joinable-нити можно вызвать pthread_join, чтобы получить ее результат, а для detached-нити нельзя вызвать pthread_join. Кроме того, ресурсы, занимаемые joinable-нитью, освобождаются при вызове pthread_join после завершения функции нити, а ресурсы detached-нити освобождаются сразу после возврата из функции нити.

Чтобы нить стала detached, надо либо создать ее с таким атрибутом, либо вызвать pthread_detach.

dmitry_vk ★★★
()
Ответ на: комментарий от slesh

pthread_detach после успешного создания потока помог. всем спасибо.

Можно сразу создать поток с PTHREAD_CREATE_DETACHED.

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