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

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

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

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

Сообщение minoshi » 29.11.2009 03:49:50

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

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

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

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

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

з.ы. Я долго тренировался в составлении запросов в гугле и яндексе, прежде чем опубликовал этот пост.
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

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

Сообщение Logo » 29.11.2009 05:42:52

По моему все правильно. Я другого пути не вижу, может слеповат :roll:, но в TThreadManager нет никаких ограничений на количество создаваемых потоков, а не мешало бы. В Виндовсе в реестре, вроде, прописывается максимальное количество. Не, Вы правы. По этой методике можно контролировать свободную память и зная, сколько тянет один поток, принимать решение, создавать новый или ожидать. Если другое приложение освободило память, то автоматически увеличится количество потоков.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

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

Сообщение Max Rusov » 29.11.2009 13:14:16

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

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

Сообщение скалогрыз » 29.11.2009 17:49:06

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

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

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

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

Сообщение minoshi » 30.11.2009 15:58:43

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


А вот за это огромное спасибо! Как-то забыл про это ... :oops:
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

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

Сообщение xdsl » 03.12.2009 07:46:54

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

Пожалуй - лучший вариант. Только вместо счетчика эффективней будет использовать семафор.
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

Рейтинг@Mail.ru