день добрый.
уже несколько дней в ступоре - может кто подскажет, почему fpc не дает запустить больше 120 нитей, а тоже приложение скомпилированное дельфой без проблем за 700 нитей уходит?
вот пример:
Модератор: Модераторы
Sergei I. Gorelkin писал(а):Разный размер стека по умолчанию. Дельфи работает только в винде, которая автоматически расширяет стек по необходимости, поэтому в нем дается минимально возможный размер в 4кБайт. Другие ОС не умеют расширять стек, поэтому в FPC по умолчанию выделяется 4 МБайт стека на поток.
Умолчания можно изменить под собственные требования - размер стека передается вторым параметром в конструктор TThread.
Bupyc писал(а):Я когда то писал реализацию TCP сервера. В ней на каждое подключение создавалась своя собственная нить. Когда количество подключений выросло, то стали происходить непонятные зависания. В итоге я выяснил, что висла функция API CreateThread после того, как количество потоков перешагивало за сотню (ОС Win2k). Переписал сервер на работу с асинхронными API (WSAAsyncSelect и т.д.) и проблема пропала.
Может я, конечно, не прав, но у меня сложилось такое мнение, что если программе требуется создавать значительное кол-во нитей, то, возможно, надо пересмотреть её алгоритм. Не могу себе представить задачу, реализация которой требовала бы создание нескольких сотен нитей.
Bupyc писал(а):Не за что. Если нужно, могу скелет сервера накидать. Там всё достаточно просто.
FeodoR писал(а):Интерфейс один. Один. Значит и выгребать его должен один, отдельно взятый для этого поток (нить). Второй уровень - обработчик того, что пришло из линии. Третий уровень - взаимодействие с пользователем, если таковой имеется.
FeodoR писал(а):Я бы сделал и без api, потому как api = привязка к конкретной ОС. Можно, в принципе, реализовать всё на уровне языка. Время выполнения/работы особо пострадать не должно.
тот же пример на дельфи создает легко 1000 нитей.FeodoR писал(а):Архитектура PC (x86, amd64), ИМХО, не предполагает работу с большим количеством нитей/пользователей/процессов.
FeodoR писал(а):А как работает переключение между этими 1000 нитями, если их них хотя бы 20% активно? Мне кажется, что тормоза будут неимоверные и будет нестабильность в выдаче результатов работы тех самых потоков.
yser писал(а):Sergei I. Gorelkin писал(а):Разный размер стека по умолчанию. Дельфи работает только в винде, которая автоматически расширяет стек по необходимости, поэтому в нем дается минимально возможный размер в 4кБайт. Другие ОС не умеют расширять стек, поэтому в FPC по умолчанию выделяется 4 МБайт стека на поток.
Умолчания можно изменить под собственные требования - размер стека передается вторым параметром в конструктор TThread.
пробовал задавать разные размеры стека, на кол-во запускаемых нитей не влияет.
в приатаченном примере стек задан = 0 (вроде как размер как и основного процесса)
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0