ChebСпасибо за рекомендации! Большей частью приходится это проверять методом тыка, разве что в свое время прочесть подобные советы. Единственно, что по поводу потоков под Windows...
Cheb писал(а):- каждый thread отъедает кусок адресного пространства, резервируя линейный, непрерывный диапазон адресов под стек. 64-битным программам пофиг, а у 32-битных абсолютный лимит где-то в районе одного-двух гигабайт (в теории - 4, но столько почти никогда не бывает). Создаёшь полсотни потоков - и уже 800 Мб нету, они сидят на этих адресах как собака на сене, и уже можешь словить крах из-за исчерпания адресного пространства. Это при том, что реально памяти используется с гулькин нос.
Скажу от себя. В свое время, чтобы побороть проблему того, что каждый создаваемый поток отъедал значительную часть памяти, которая ему потребовалась бы (из-за этого система и не запускала дальше потоки, когда их количество примерно достигала от 60 до 120 на разных компьютерах), причем такое происходило и на 64 битных (может тут и ошибаюсь).
Я делал так
- Код: Выделить всё
constructor TMyThread.Create;
begin
...
FFailedToCreate := False;
try
inherited Create(True, 128*1024);
except
FFailedToCreate := True;
end;
...
end;
, где 128*1024 и есть вроде бы размер стека, но... Это типа не срабатывало, был или и есть глюк в лазаре, что все равно бралось значение по умолчанию. И мне удалось чтобы это заработало методом тыка, только когда проставил значение стека в настройках компиляции проекта, как я показал на картинке сверху...
P.S. Сейчас может все работает как надо и размер стека в Windows можно прописывать при создании и без этих манипуляций... Может я что-то и перепутал тут. Давно делал и не помню точно, что и зачем я это делал досконально )
Добавлено спустя 4 минуты 35 секунд:Да, вот нашел. был баг (может и есть еще)
https://bugs.freepascal.org/view.php?id=17755Получается какой бы маленький стек не задаешь для потоков, все равно не создается больше определенного количества в Windows. Помогает как раз этот ключ
-Cs. Ньюансов проблемы не помню, но после этих манипуляций программа смогла создавать и 100 и 300 и 500 потоков