Russian Qt Forum
Ноябрь 27, 2024, 03:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QThread(поток) и утечка виртуальной памяти..  (Прочитано 9463 раз)
garryHotDog
Гость
« : Март 03, 2010, 20:27 »

Всем привет!!!
   Столкнулся вот с какой проблемой - создаю 1000 потоков Qthread(через new), потом запускаю их поочередно...
код фукции run:
Код:
	while( !m_mustTerminate )
{
iii++;
                       msleep(100);
}

..в результате после запуска всех потоков - размер виртуальной памяти (смотрел через procesXp) которую использует приложение вырос до ~1000Мб.
   Начал отлаживать  и заметил что после запуска потока - выделяется 1мб вирт. памяти!?
   Пробовал уменьшать стек потока - не помогло!
   Если потоки будут завершаться(т.е. убрать while), а потом сразу их запускать - память начинает "плавать"(выделяется\удаляется)

Подскажите как решить такую проблему.....кто не верит что память утекает попробуете сами(код на 10мин)....заранее спасибо!!!
Записан
BRE
Гость
« Ответ #1 : Март 03, 2010, 20:36 »

Так а что тебя удивляет?
Записан
garryHotDog
Гость
« Ответ #2 : Март 03, 2010, 21:12 »

Меня удивляет такой расход памяти! Почему уходит 1MB памяти на пустой поток(Это в release). т.е. система не выдержит большого кол-ва потоков....пробовал в win32\linux...ситуация одинаковая!!...сейчас вот испытываю pthread в линуксе
Записан
BRE
Гость
« Ответ #3 : Март 03, 2010, 21:18 »

Меня удивляет такой расход памяти! Почему уходит 1MB памяти на пустой поток(Это в release). т.е. система не выдержит большого кол-ва потоков....пробовал в win32\linux...ситуация одинаковая!!...сейчас вот испытываю pthread в линуксе
Да не имеет никакого значения debug/release. Поток это объект ядра, кстати довольно тяжелый объект.
Записан
garryHotDog
Гость
« Ответ #4 : Март 03, 2010, 21:29 »

т.е. это нормально???...а как с APIшными потоками (win32)- тоже самое?Непонимающий
Записан
BRE
Гость
« Ответ #5 : Март 03, 2010, 21:34 »

т.е. это нормально???...а как с APIшными потоками (win32)- тоже самое?Непонимающий
Это нормально.
Поток это системный объект. Qt прячет всю работу с ним в своем классе QThread, т.е. это просто обертка для системных потоков.
Записан
garryHotDog
Гость
« Ответ #6 : Март 03, 2010, 21:38 »

а почему именно виртуальная память утекает?! что то я совсем запутался в памяти Шокированный
Записан
BRE
Гость
« Ответ #7 : Март 03, 2010, 21:43 »

а почему именно виртуальная память утекает?! что то я совсем запутался в памяти Шокированный
Ну так адресное пространство для потока сформировать нужно?
Главное, что физические страницы без надобности выделяться не будут.
Записан
garryHotDog
Гость
« Ответ #8 : Март 03, 2010, 22:27 »

ладно буду искать способ избавиться от потоков тогда (память критична)....спасибо БОЛЬШОЕ ЗА ОТВЕТЫ!!!
Записан
BRE
Гость
« Ответ #9 : Март 03, 2010, 22:50 »

ладно буду искать способ избавиться от потоков тогда (память критична)
Не обязательно от них избавлять, часто они бывают очень полезны. Главное понимать, что производительность процессора это константа и эта производительность будет все равно делиться между всеми потоками. Т.е. не обязательно создавать 1000 или 10000 потоков, это не даст выигрыша в скорости выполнения.
Например, можно использовать очереди задач, которые будут выполняться на нескольких потоках. Когда одна задача завершается (поток освобождается), он может при наличии в очереди других задач, взять на обслуживание новую.
« Последнее редактирование: Март 03, 2010, 23:10 от BRE » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Март 03, 2010, 23:10 »

Потоков должно быть столько, сколько процессоров/ядер.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Amigo_sa
Гость
« Ответ #11 : Март 04, 2010, 11:16 »

Потоков должно быть столько, сколько процессоров/ядер.
В дот нете советуют удваивать количество потоков, по сравнению с числом ядер, хз почему...
А еще нужно обращать внимание, поддерживает ли ваш процессор HyperThreading - он тоже позволяет создавать больше потоков чем ядер.
Записан
BlackTass
Гость
« Ответ #12 : Март 04, 2010, 12:46 »

Потоков должно быть столько, сколько процессоров/ядер.
Не согласен немного. Для числодробилок (то есть когда большинство времени работы потока это нагрузка на проц) лучше делать число ядер+1, а для обычных бекграунд потоков вполне подойдет и формула число ядер*2. Опять же все зависит от задачи.
Записан
garryHotDog
Гость
« Ответ #13 : Март 04, 2010, 13:08 »

в моей задаче нужно что бы потоков было как можно больше, а именно 1000....с виртуальной память немного разобрался(в win32) - она резервируется сразу же (1000мб), а может использоваться толко частично, например 100мб (ОС сама разберется)....1000мб получается за счет того что размер стека у потока по умолчанию 1мб.......но столкнулся с другой проблемой :

Делаю такое же приложение (1000 пустых потоков) в линуксе (Ubuntu)......системный менеджер пишет что используется 3ГБ  виртуальной памяти?!...почему так получается пока не знаю...уменьшать размер стека пока не пробовал....но когда запускаю рабочий вариант программв (где потоки не пустые) через некоторое время появляется ошибка -
Цитировать
Glib-error**: Cannot create pipe main loop wake-up: too many open files
....причину ошибки пока не выяснил...может кто-нибудь подскажет???
Записан
BlackTass
Гость
« Ответ #14 : Март 04, 2010, 16:02 »

Если не секрет что за задача такая где нужно столько одновременных потоков?

По поводу ошибки. Возможно где-то работаете с файлами/сокетами и забываете их закрывать?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.311 секунд. Запросов: 23.