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

Общие вопросы программирования, алгоритмы и т.п.

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

Ответить
Аватара пользователя
minoshi
постоялец
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

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

Сообщение minoshi »

Доброго времени суток!

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

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

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

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

з.ы. Я долго тренировался в составлении запросов в гугле и яндексе, прежде чем опубликовал этот пост.
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

По моему все правильно. Я другого пути не вижу, может слеповат :roll:, но в TThreadManager нет никаких ограничений на количество создаваемых потоков, а не мешало бы. В Виндовсе в реестре, вроде, прописывается максимальное количество. Не, Вы правы. По этой методике можно контролировать свободную память и зная, сколько тянет один поток, принимать решение, создавать новый или ожидать. Если другое приложение освободило память, то автоматически увеличится количество потоков.
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Еще проверьте, какой стек по умолчанию задается для каждого потока. Это может зависеть от версии FPC, если Вы не указываете его явно. Сам на это напоролся недавно:
http://www.freepascal.ru/forum/viewtopic.php?p=34689#p34689
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

Использовать сторонний счётчик - единственно правильное решение (причём оно уже сделано!)

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

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

Сообщение minoshi »

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


А вот за это огромное спасибо! Как-то забыл про это ... :oops:
xdsl
постоялец
Сообщения: 131
Зарегистрирован: 15.01.2009 12:49:03

Сообщение xdsl »

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

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