Размер стека для потока
Добавлено: 23.04.2014 11:36:27
Изучая исходники Free Pascal под Windows нетрудно обнаружить, почему каждый поток отжирает много памяти - это зашито в вызове BeginThread:
Не знаю, как это решать в общем случае, но для WINDOWS я наткнулся на интересные рекомендации от Микрософт http://support.microsoft.com//kb/315937. Там используется ассемблерная вставка, так что Микрософт не гарантирует работу кода даже для Windows c не x86-архитектурой. Хотя наверно можно по аналогии сделать рабочий вариант для других платформ.
Суть предложений Микрософт в том, что поначалу создаётся небольшой стек, за границей которого отводится специальная страница защиты. При попытке потока вылезти за пределы стека возникает исключение, обработчик которого динамически увеличивает стек и возвращает управление туда, откуда было исключение.
Я не очень хорошо знаю Си. Кто-нибудь пытался перевести эти рекомендации на паскаль? Может быть это уже сделано в современных версиях Delphi?
- Код: Выделить всё
function BeginThread(ThreadFunction : tthreadfunc) : TThreadID;
var
dummy : TThreadID;
begin
BeginThread:=BeginThread(nil,DefaultStackSize,ThreadFunction,nil,0,dummy);
end;
- Код: Выделить всё
constructor TThread.Create(CreateSuspended: Boolean;
const StackSize: SizeUInt = DefaultStackSize);
begin
inherited Create;
FSuspended := CreateSuspended;
FInitialSuspended := CreateSuspended;
{ Always start in suspended state, will be resumed in AfterConstruction if necessary
See Mantis #16884 }
FHandle := BeginThread(nil, StackSize, @ThreadProc, pointer(self), CREATE_SUSPENDED,
FThreadID);
Не знаю, как это решать в общем случае, но для WINDOWS я наткнулся на интересные рекомендации от Микрософт http://support.microsoft.com//kb/315937. Там используется ассемблерная вставка, так что Микрософт не гарантирует работу кода даже для Windows c не x86-архитектурой. Хотя наверно можно по аналогии сделать рабочий вариант для других платформ.
Суть предложений Микрософт в том, что поначалу создаётся небольшой стек, за границей которого отводится специальная страница защиты. При попытке потока вылезти за пределы стека возникает исключение, обработчик которого динамически увеличивает стек и возвращает управление туда, откуда было исключение.
Я не очень хорошо знаю Си. Кто-нибудь пытался перевести эти рекомендации на паскаль? Может быть это уже сделано в современных версиях Delphi?