LINUX.ORG.RU

pthread_detach() не рулит...


0

0

Может кто подсказать, почему система игнорирует мой явный указ освобождать память после завершения потока, причем никаких ошибок не вылезает (errno чист). Пробывал непосредственно указать атрибуты <p> pthread_attr_t attr;

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); <p> пробывал прям в потоке вызвать ему детач, все равно диспетчер памяти показывает,что поток не освободил занятые им ресурсы падла.

ось - бубунта

anonymous
Ответ на: комментарий от mv

// Set special statuc for pthread

pthread_attr_t attr;

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

pthread_create(&thread_id, &attr, &TSERVER_CONNECT, &argv);

....

void* TSERVER_CONNECT(void* arg){

sleep(10);

//pthread_detach(thread_id); // если без attr //pthread_exit(NULL);// нах надо?

return NULL; }

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

Спасибо, уже разобрался, хотя память все равно не сразу освобождается, вероятно часть идет как кеш.

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

Извиняюсь, погорячился, проблема так и осталась. Может это особенность юбунты ? Вот пример из книги, вызов pthread_join должен отобрать ~10mb выделенных на создание нити, чего НЕ ПРОИСХОДИТ:

#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> char message[] = "Hello World"; void *thread_function(void *arg) { printf("thread_function started. Arg was %s\n", (char *)arg); sleep(10); strcpy(message, "Bye!"); //pthread_exit((void*)"See Ya"); return NULL; } int main() { int res; pthread_t a_thread; void *thread_result; sleep(5); res = pthread_create(&a_thread, NULL, thread_function, (void *)message); if (res != 0) { perror("Thread creation failed"); exit(EXIT_FAILURE); } sleep(3); printf("Waiting for thread to finish...\n"); res = pthread_join(a_thread, &thread_result); if (res != 0) { perror("Thread join failed"); exit(EXIT_FAILURE); } printf("Thread joined, it returned %s\n", (char *)thread_result); sleep(4444); exit(EXIT_SUCCESS); }

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

#include  <unistd.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>
#include  <pthread.h>
char message[] = "Hello World";
void *thread_function(void *arg) {
    printf("thread_function started. Arg was %s\n", (char *)arg);
    sleep(10);
    strcpy(message, "Bye!");
   //pthread_exit((void*)"See Ya");
   return NULL;
}
int main() {
    int res;
    pthread_t a_thread;
    void *thread_result;
    sleep(5);
    res = pthread_create(&a_thread, NULL, thread_function, (void *)message);
    if (res != 0) {
         perror("Thread creation failed");
         exit(EXIT_FAILURE);
    }
    sleep(3);
    printf("Waiting for thread to finish...\n");
    res = pthread_join(a_thread, &thread_result);
    if (res != 0) {
         perror("Thread join failed");
         exit(EXIT_FAILURE);
    }
    printf("Thread joined, it returned %s\n", (char *)thread_result);
    sleep(4444);
    exit(EXIT_SUCCESS);
}
 

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

> Извиняюсь, погорячился, проблема так и осталась. Может это особенность юбунты ? Вот пример из книги, вызов pthread_join должен отобрать ~10mb выделенных на создание нити, чего НЕ ПРОИСХОДИТ

А почему память должна моментально освобождаться? Выделение памяти - довольно накладная операция, если бы по завершении треда выделенные сегменты возвращались ядру, то программы на тредах не слишком бы отличались от реализаций на процессах.

Добавь цикл create/join, смотри pmap'ом - раскладка памяти после первого треда не меняется.

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

Спасибо, действительно так оно и есть.

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

да, а в Линухе надо крутануть эксцентриковую ось вилки стартера :L)

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