Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое создание потоков, pthread 
V
    Опции темы
chubaka
Дата 30.4.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



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

И еще. Нужно ли в обработчике потока, в самой функции которая работает как поток, в конце выполнять какието действия по освобождению ? Динамической памяти функция не создает. 
PM MAIL   Вверх
azesmcar
Дата 30.4.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 1
Всего: 211



Цитата

завершаю pthread_join

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

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

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

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

Это сообщение отредактировал(а) azesmcar - 30.4.2009, 13:08
PM   Вверх
MAKCim
Дата 30.4.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
chubaka
Дата 30.4.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



Вообщем опишу ситуация по другому. 

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

#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 сразу. Ведь пямяти каждый раз все больше и больше уходит. 

PM MAIL   Вверх
MAKCim
Дата 30.4.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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


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


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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
chubaka
Дата 30.4.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



понял, спасибо. но всеравно немного странно звучит, "не моя забота" smile 
нужна стабильность софта, а памяти кушает и кушает. 
PM MAIL   Вверх
chubaka
Дата 30.4.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.6.2007

Репутация: нет
Всего: нет



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

Код

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);


Спасибо большое всем ! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.