Russian Qt Forum
Ноябрь 27, 2024, 03:44
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
QThread(поток) и утечка виртуальной памяти..
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QThread(поток) и утечка виртуальной памяти.. (Прочитано 9466 раз)
garryHotDog
Гость
QThread(поток) и утечка виртуальной памяти..
«
:
Март 03, 2010, 20:27 »
Всем привет!!!
Столкнулся вот с какой проблемой - создаю 1000 потоков Qthread(через new), потом запускаю их поочередно...
код фукции run:
Код:
while( !m_mustTerminate )
{
iii++;
msleep(100);
}
..в результате после запуска всех потоков - размер виртуальной памяти (смотрел через procesXp) которую использует приложение вырос до ~1000Мб.
Начал отлаживать и заметил что после запуска потока - выделяется 1мб вирт. памяти!?
Пробовал уменьшать стек потока - не помогло!
Если потоки будут завершаться(т.е. убрать while), а потом сразу их запускать - память начинает "плавать"(выделяется\удаляется)
Подскажите как решить такую проблему.....кто не верит что память утекает попробуете сами(код на 10мин)....заранее спасибо!!!
Записан
BRE
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #1 :
Март 03, 2010, 20:36 »
Так а что тебя удивляет?
Записан
garryHotDog
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #2 :
Март 03, 2010, 21:12 »
Меня удивляет такой расход памяти! Почему уходит 1MB памяти на пустой поток(Это в release). т.е. система не выдержит большого кол-ва потоков....пробовал в win32\linux...ситуация одинаковая!!...сейчас вот испытываю pthread в линуксе
Записан
BRE
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #3 :
Март 03, 2010, 21:18 »
Цитата: garryHotDog от Март 03, 2010, 21:12
Меня удивляет такой расход памяти! Почему уходит 1MB памяти на пустой поток(Это в release). т.е. система не выдержит большого кол-ва потоков....пробовал в win32\linux...ситуация одинаковая!!...сейчас вот испытываю pthread в линуксе
Да не имеет никакого значения debug/release. Поток это объект ядра, кстати довольно тяжелый объект.
Записан
garryHotDog
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #4 :
Март 03, 2010, 21:29 »
т.е. это нормально???...а как с APIшными потоками (win32)- тоже самое?
Записан
BRE
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #5 :
Март 03, 2010, 21:34 »
Цитата: garryHotDog от Март 03, 2010, 21:29
т.е. это нормально???...а как с APIшными потоками (win32)- тоже самое?
Это нормально.
Поток это системный объект. Qt прячет всю работу с ним в своем классе QThread, т.е. это просто обертка для системных потоков.
Записан
garryHotDog
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #6 :
Март 03, 2010, 21:38 »
а почему именно виртуальная память утекает?! что то я совсем запутался в памяти
Записан
BRE
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #7 :
Март 03, 2010, 21:43 »
Цитата: garryHotDog от Март 03, 2010, 21:38
а почему именно виртуальная память утекает?! что то я совсем запутался в памяти
Ну так адресное пространство для потока сформировать нужно?
Главное, что физические страницы без надобности выделяться не будут.
Записан
garryHotDog
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #8 :
Март 03, 2010, 22:27 »
ладно буду искать способ избавиться от потоков тогда (память критична)....спасибо БОЛЬШОЕ ЗА ОТВЕТЫ!!!
Записан
BRE
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #9 :
Март 03, 2010, 22:50 »
Цитата: garryHotDog от Март 03, 2010, 22:27
ладно буду искать способ избавиться от потоков тогда (память критична)
Не обязательно от них избавлять, часто они бывают очень полезны. Главное понимать, что производительность процессора это константа и эта производительность будет все равно делиться между всеми потоками. Т.е. не обязательно создавать 1000 или 10000 потоков, это не даст выигрыша в скорости выполнения.
Например, можно использовать очереди задач, которые будут выполняться на нескольких потоках. Когда одна задача завершается (поток освобождается), он может при наличии в очереди других задач, взять на обслуживание новую.
«
Последнее редактирование: Март 03, 2010, 23:10 от BRE
»
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #10 :
Март 03, 2010, 23:10 »
Потоков должно быть столько, сколько процессоров/ядер.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Amigo_sa
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #11 :
Март 04, 2010, 11:16 »
Цитата: Пантер от Март 03, 2010, 23:10
Потоков должно быть столько, сколько процессоров/ядер.
В дот нете советуют удваивать количество потоков, по сравнению с числом ядер, хз почему...
А еще нужно обращать внимание, поддерживает ли ваш процессор HyperThreading - он тоже позволяет создавать больше потоков чем ядер.
Записан
BlackTass
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #12 :
Март 04, 2010, 12:46 »
Цитата: Пантер от Март 03, 2010, 23:10
Потоков должно быть столько, сколько процессоров/ядер.
Не согласен немного. Для числодробилок (то есть когда большинство времени работы потока это нагрузка на проц) лучше делать число ядер+1, а для обычных бекграунд потоков вполне подойдет и формула число ядер*2. Опять же все зависит от задачи.
Записан
garryHotDog
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #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
Гость
Re: QThread(поток) и утечка виртуальной памяти..
«
Ответ #14 :
Март 04, 2010, 16:02 »
Если не секрет что за задача такая где нужно столько одновременных потоков?
По поводу ошибки. Возможно где-то работаете с файлами/сокетами и забываете их закрывать?
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...