Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Динамическое создание потоков


Автор: chubaka 30.4.2009, 11:08
Здравствуйте. 
Есть программа, которая на протяжении своей жизни постоянно создает и удаляет потоки. В идеале она не должна выключаться совсем.
Создаю потоки pthread_create, завершаю pthread_join. Смотрю сколько памяти занимает программа - после каждого освобождения потока она не освобождается. Подскажите пожалуйста как правильно создавать и завершать потоки.

И еще. Нужно ли в обработчике потока, в самой функции которая работает как поток, в конце выполнять какието действия по освобождению ? Динамической памяти функция не создает. 

Автор: azesmcar 30.4.2009, 13:08
Цитата

завершаю pthread_join

я чего-то не понял? с каких пор pthread_join завершает поток?

Добавлено через 1 минуту и 14 секунд
Цитата

ть программа, которая на протяжении своей жизни постоянно создает и удаляет потоки. 

вот тут поподробнее.

Автор: MAKCim 30.4.2009, 15:14
Цитата(chubaka @  30.4.2009,  11:08 Найти цитируемый пост)
Смотрю сколько памяти занимает программа - после каждого освобождения потока она не освобождается

это нормально
libc кэширует память, выделяемую под стеки потоков

Автор: chubaka 30.4.2009, 19:09
Вообщем опишу ситуация по другому. 

Вот специально приготовил пример. Есть такая программа:
Код

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#include <iostream> 

static void wait_thread(void)
{
    time_t start_time = time(NULL);
 
    while (time(NULL) == start_time)
    {
        // пауза 1 секунда
    }
}
 
static void *thread_func(void *vptr_args)
{
    int i;
 
    for (i = 0; i < 20; i++)
    {
        fputs("  b\n", stderr);
        wait_thread();
    }
    return NULL;
}
 
int main(void)
{
    int i;
    pthread_t thread[5];
 
    for (i = 0; i <= 4; i++)
    {
    if (pthread_create(&thread[i], NULL, thread_func, NULL) != 0)
    {
        return EXIT_FAILURE;
    }
    // пауза 5 секунд
     wait_thread();
     wait_thread();
     wait_thread();
     wait_thread();
     wait_thread();
    }
 
    for (i = 0; i < 20; i++)
    {
        fputs("a\n", stdout);
        wait_thread();
    }
 
    for (i = 0; i <= 4; i++)
    {
    if (pthread_join(thread[i], NULL) != 0)
    {
        return EXIT_FAILURE;
    }
    }
    std::cout << "exit"; 

    // ждем окончания программы но делаем паузу
    std::cin.get();
    return EXIT_SUCCESS;
}



Она не делает ничего, создает 5 потоков и потом их завершает. 
Тесты проходят на UBUNTU. Между запуском каждого потока пауза в 5 секунд. 

И так, компилируем и запускаем программу:
Цитата
g++ -o test test.cpp -lpthread

Цитата
./test


Смотрим статистику по использованной памяти. Сразу после старта программа создает первый поток.
Цитата
aptem@aptem-desktop:~$ ps aux | grep test
aptem     5615  109  0.1  11220   928 pts/0    Rl+  18:45   0:04 ./test


Проходит 5 секунд, запускается второй поток:
Цитата
aptem@aptem-desktop:~$ ps aux | grep test
aptem     5615 95.1  0.1  19416   932 pts/0    Rl+  18:45   0:06 ./test


Проходит 5 секунд, запускается третий поток:
Цитата
aptem@aptem-desktop:~$ ps aux | grep test
aptem     5615  100  0.1  27612   936 pts/0    Rl+  18:45   0:10 ./test


Проходит 5 секунд, запускается четвертый поток:
Цитата
aptem@aptem-desktop:~$ ps aux | grep test
aptem     5615 96.7  0.1  35808   940 pts/0    Rl+  18:45   0:16 ./test


Проходит 5 секунд, запускается пятый поток:
Цитата
aptem@aptem-desktop:~$ ps aux | grep test
aptem     5615  100  0.1  44004   992 pts/0    Rl+  18:45   0:21 ./test


После того как все потоки завершились:
Цитата
aptem@aptem-desktop:~$ ps aux | grep test
aptem     5615 94.2  0.2  35816  1052 pts/0    S+   18:45   0:43 ./test


Вопросы:
1. Почему пямяти не стало столько, сколько было первоначально ? 
2. Что мне делать, если программа на протяжении своей жизни будет создавать десятки тысяч потоков и их завершать. Естественно не одновременно, а постепенно по 2-3 сразу. Ведь пямяти каждый раз все больше и больше уходит. 

Автор: MAKCim 30.4.2009, 21:30
Цитата(chubaka @  30.4.2009,  19:09 Найти цитируемый пост)
1. Почему пямяти не стало столько, сколько было первоначально ? 


Цитата(MAKCim @  30.4.2009,  15:14 Найти цитируемый пост)
это нормально
libc кэширует память, выделяемую под стеки потоков 


Цитата(chubaka @  30.4.2009,  19:09 Найти цитируемый пост)
2. Что мне делать, если программа на протяжении своей жизни будет создавать десятки тысяч потоков и их завершать. Естественно не одновременно, а постепенно по 2-3 сразу. Ведь пямяти каждый раз все больше и больше уходит.  

ничего не надо делать, это не твоя забота

Автор: chubaka 30.4.2009, 21:55
понял, спасибо. но всеравно немного странно звучит, "не моя забота" smile 
нужна стабильность софта, а памяти кушает и кушает. 

Автор: chubaka 30.4.2009, 22:17
Вообщем помоему проблема решилась. На более большом количество потоков видно, что память освобождается. Теперь использую отсоедененные сокеты.

Код

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&thread1_id, &attr, &stream_reader, struct1);
pthread_attr_destroy(&attr);


Спасибо большое всем ! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)