Страница 1 из 1

Контроль количества запущенных потоков

СообщениеДобавлено: 29.11.2009 03:49:50
minoshi
Доброго времени суток!

Собственно сабж....

Имеется программа, работающая с потоками (копирование неопределенного количества файлов). При необходимости копировать очень большого количества файлов, свыше 1500 штук, появляется известная ошибка о недостатке памяти.

Пока решил проблему так : подвесил отдельный счетчик(при создании очередного потока он увеличивается на единицу, при завершении потока - уменьшается) - и при создании очередного потока контролирую, чтобы он не превышал определенного количества, если превышает ждем (посредством sleep()).
Что-то мне подсказывает, что это не очень правильно.

Может кто сталкивался с подобной проблемой? Или знаете документик в интернете по этой проблематике?

з.ы. Я долго тренировался в составлении запросов в гугле и яндексе, прежде чем опубликовал этот пост.

Re: Контроль количества запущенных потоков

СообщениеДобавлено: 29.11.2009 05:42:52
Logo
По моему все правильно. Я другого пути не вижу, может слеповат :roll:, но в TThreadManager нет никаких ограничений на количество создаваемых потоков, а не мешало бы. В Виндовсе в реестре, вроде, прописывается максимальное количество. Не, Вы правы. По этой методике можно контролировать свободную память и зная, сколько тянет один поток, принимать решение, создавать новый или ожидать. Если другое приложение освободило память, то автоматически увеличится количество потоков.

Re: Контроль количества запущенных потоков

СообщениеДобавлено: 29.11.2009 13:14:16
Max Rusov
Еще проверьте, какой стек по умолчанию задается для каждого потока. Это может зависеть от версии FPC, если Вы не указываете его явно. Сам на это напоролся недавно:
http://www.freepascal.ru/forum/viewtopic.php?p=34689#p34689

Re: Контроль количества запущенных потоков

СообщениеДобавлено: 29.11.2009 17:49:06
скалогрыз
Использовать сторонний счётчик - единственно правильное решение (причём оно уже сделано!)

Ограничивать его на уровне FPC неправильно. Потому что threadmanager не более чем кроссплатформенная обёртка вокруг системного API. Об ограничении должна думать сама программа.

ЗЫ: но создавать 1 поток копирования на каждый файл - неэффективно. Вообще использование большого количества потоков, особенно для решения одной и той же задачи может навредить программе, потому что огромное количество времени будет тратится просто на переключение контекста между потоками, вместо их работы. Я бы предложил ограничиться 20ью потоками, хотя опять же, всё зависит от самой программы.

Re: Контроль количества запущенных потоков

СообщениеДобавлено: 30.11.2009 15:58:43
minoshi
Max Rusov писал(а):Еще проверьте, какой стек по умолчанию задается для каждого потока. Это может зависеть от версии FPC, если Вы не указываете его явно. Сам на это напоролся недавно:
http://www.freepascal.ru/forum/viewtopic.php?p=34689#p34689


А вот за это огромное спасибо! Как-то забыл про это ... :oops:

Re: Контроль количества запущенных потоков

СообщениеДобавлено: 03.12.2009 07:46:54
xdsl
minoshi писал(а):Пока решил проблему так : подвесил отдельный счетчик(при создании очередного потока он увеличивается на единицу, при завершении потока - уменьшается) - и при создании очередного потока контролирую, чтобы он не превышал определенного количества, если превышает ждем (посредством sleep()).
Что-то мне подсказывает, что это не очень правильно.

Пожалуй - лучший вариант. Только вместо счетчика эффективней будет использовать семафор.