Russian Qt Forum

Qt => Общие вопросы => Тема начата: garryHotDog от Март 03, 2010, 20:27



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

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

Подскажите как решить такую проблему.....кто не верит что память утекает попробуете сами(код на 10мин)....заранее спасибо!!!


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: BRE от Март 03, 2010, 20:36
Так а что тебя удивляет?


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: garryHotDog от Март 03, 2010, 21:12
Меня удивляет такой расход памяти! Почему уходит 1MB памяти на пустой поток(Это в release). т.е. система не выдержит большого кол-ва потоков....пробовал в win32\linux...ситуация одинаковая!!...сейчас вот испытываю pthread в линуксе


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


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: garryHotDog от Март 03, 2010, 21:29
т.е. это нормально???...а как с APIшными потоками (win32)- тоже самое????


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: BRE от Март 03, 2010, 21:34
т.е. это нормально???...а как с APIшными потоками (win32)- тоже самое????
Это нормально.
Поток это системный объект. Qt прячет всю работу с ним в своем классе QThread, т.е. это просто обертка для системных потоков.


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: garryHotDog от Март 03, 2010, 21:38
а почему именно виртуальная память утекает?! что то я совсем запутался в памяти :o


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: BRE от Март 03, 2010, 21:43
а почему именно виртуальная память утекает?! что то я совсем запутался в памяти :o
Ну так адресное пространство для потока сформировать нужно?
Главное, что физические страницы без надобности выделяться не будут.


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: garryHotDog от Март 03, 2010, 22:27
ладно буду искать способ избавиться от потоков тогда (память критична)....спасибо БОЛЬШОЕ ЗА ОТВЕТЫ!!!


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: BRE от Март 03, 2010, 22:50
ладно буду искать способ избавиться от потоков тогда (память критична)
Не обязательно от них избавлять, часто они бывают очень полезны. Главное понимать, что производительность процессора это константа и эта производительность будет все равно делиться между всеми потоками. Т.е. не обязательно создавать 1000 или 10000 потоков, это не даст выигрыша в скорости выполнения.
Например, можно использовать очереди задач, которые будут выполняться на нескольких потоках. Когда одна задача завершается (поток освобождается), он может при наличии в очереди других задач, взять на обслуживание новую.


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: Пантер от Март 03, 2010, 23:10
Потоков должно быть столько, сколько процессоров/ядер.


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: Amigo_sa от Март 04, 2010, 11:16
Потоков должно быть столько, сколько процессоров/ядер.
В дот нете советуют удваивать количество потоков, по сравнению с числом ядер, хз почему...
А еще нужно обращать внимание, поддерживает ли ваш процессор HyperThreading - он тоже позволяет создавать больше потоков чем ядер.


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: BlackTass от Март 04, 2010, 12:46
Потоков должно быть столько, сколько процессоров/ядер.
Не согласен немного. Для числодробилок (то есть когда большинство времени работы потока это нагрузка на проц) лучше делать число ядер+1, а для обычных бекграунд потоков вполне подойдет и формула число ядер*2. Опять же все зависит от задачи.


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: garryHotDog от Март 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
....причину ошибки пока не выяснил...может кто-нибудь подскажет???


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: BlackTass от Март 04, 2010, 16:02
Если не секрет что за задача такая где нужно столько одновременных потоков?

По поводу ошибки. Возможно где-то работаете с файлами/сокетами и забываете их закрывать?


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: garryHotDog от Март 04, 2010, 18:34
Задача такова  что в каждом потоке работает сокет, который читает и отправляет данные(можно конечно переделать на асинхронные сокеты, но вариант с потоками оказался проще)....

Цитировать
Возможно где-то работаете с файлами/сокетами и забываете их закрывать?

может и в этом проблема.....просто прога работает на Linux при 300 потоках, а когда ставлю 350 падает с ошибкой....вот это меня и смущает....

назрел вопрос: если сокет переходит в состояние QAbstractSocket::UnconnectedState - нужно ли выполнять операцию close()...я так не делаю-просто снова пробую открыть сокет....подскажите пожалуйста???


Название: Re: QThread(поток) и утечка виртуальной памяти..
Отправлено: garryHotDog от Март 04, 2010, 22:16
c ошибкой
Цитировать
Cannot create pipe main loop wake-up: too many open files
разобрался путем изменения ограничений на кол-во открытых файлов в системе- /etc/security/limits.conf....но виртуальной памяти выделяется все равно слишком много!!!