Если вы используете поток (не main, например: sock connection) и основной поток, поэтому они используют один и тот же стек. Решите так: просто создайте поток со своим стеком для каждого соединения.
Проблема> каждый вызов, который вы делаете, вызывает стек для фрейма (общая проблема очень большая)
Например, вы вызываете proc aa (a, b: integer), например, при вызове всегда одной и той же функции или другой;
У вас запущен поток сокетов, и onconnect вы вызываете proc a; и продолжает делать что-то, это занимает 5 секунд.
, если кто-то подключается до соединения «закрыто» (выпуск стека).
У вас есть 2 подключенных клиента (2 кадра стека различий с различными данными)
стек
push a, b (целое число); Значения 5,10 - от 1 конн
push a, b (целое число); Значения 7,3 - от 2 кон
если onconnect вызывает функции a (5,10) и продолжает делать что-то около 5 секунд.
и кто-то снова подключается к серверному сокету, он снова вызывает соединение.
Стек устарел первый кадр вызова, но еще не вышел из proc. Так что не поп а, б из (5,10)
Это сложнее, чем если вы снова вызовете proc, тогда он переопределит данные в 2 кадре (локальная переменная proc 2 соединения), поэтому, когда 2 соединения получают данные из стека, они наверняка будут переопределены другой информацией. поэтому он будет вести себя некорректно.
Когда первое соединение не работает, выскочит a, b, но 7,3 (из второго соединения), а не 5,10, которые он сохранил. поэтому переполнение стека произойдет не в данный момент, а позже, при запуске программы и ошибках выпуска стека, в итоге вы получите стек $FFFFFFFF $SP
. поэтому он попытается $FFFFFFAA
, когда вы вызываете функцию, которая больше, чем у вас, например: $M 65536
, а не 4 гигабайта, как $FFFFFFAA
.