Рейтинг:
30
mr.abzadeh
Моя программа не исчерпывает стек. Я хочу измерить свой стек потоков пользователя так, чтобы создавать потоки с меньшим размером стека, эффективно используя память
МР.abzadeh
[no name]
Я снова спрашиваю, почему? Если бы это была реальная проблема, то она уже была бы решена. Сколько потоков у вас есть, что вы обеспокоены использованием памяти? Если у вас их так много, что вам не хватает памяти из-за стеков потоков, то, возможно, у вас действительно есть другие проблемы. Однако мой ответ показывает способ сделать это.
mr.abzadeh
Я оказываю услугу. Я создаю поток для каждого соединения. В настоящее время моих клиентов может быть до 200, поэтому мой сервис может иметь до 200 потоков. Совместное использование потоков может повысить производительность, но я не знаю, как разбудить поток при поступлении нового пакета. Любое предложение приветствуется
МР.abzadeh
[no name]
Вы используете пул потоков?
mr.abzadeh
Спасибо. Ссылки, которые вы мне показали, великолепны и очень полезны, и теперь я могу оценить использование стека моих услуг. Я создаю потоки с размером стека 64 КБ. Я не использую пул потоков, потому что любое соединение с предоставляемой мной службой остается активным в течение нескольких часов. Теперь я думаю, что пришло время создать несколько потоков, скажем 16, и основной поток будет принимать только сокеты и передавать их рабочим потокам, снова упоминая, что моя проблема заключается в том, как основной поток будет немедленно передавать управление рабочим потокам.
МР.abzadeh
Рейтинг:
2
Member 14683465
{$IFDEF MSWINDOWS}
function currentStackUsage: NativeUInt;
//NB: Win32 uses FS, Win64 uses GS as base for Thread Information Block.
asm
{$IFDEF WIN32}
mov eax, fs:[4] // TIB: base of the stack
sub eax, esp // compute difference in EAX (=Result)
{$ENDIF}
{$IFDEF WIN64}
mov rax, gs:[8] // TIB: base of the stack
sub rax, rsp // compute difference in RAX (=Result)
{$ENDIF}
{$ENDIF}
end;
Dave Kreskowiak
Необъяснимый дамп кода и то, как его использовать, - это не ответ.
Member 14683465
Вызовите эту функцию до или внутри функции, для которой вы хотите узнать использование стека. Например, в рекурсивной функции, чтобы избежать переполнения стека.
Рейтинг:
0
mr.abzadeh
Спасибо за ваш комментарий.
Ссылка, на которую вы указали, обнаруживает бездействие системных ресурсов, таких как cpu, gpu, и не помогает измерять измерение использования стека.
Мне не совсем ясно, что вы имели в виду под "языком кода"
Рейтинг:
0
nv3
Очень простой метод измерения текущего уровня стека-это взять адрес переменной, которая выделена в стеке, например:
char* GetCurrentStackLevel()
{
char a;
return &a;
}
Затем вызовите эту функцию до и внутри функции, из которой вы хотите измерить использование стека, и вычтите два указателя. Использование стека GetCurrentStackLevel само по себе отменит это вычитание.
Обратите внимание, что вы не можете использовать возвращаемое значение ни для чего другого! К тому времени, когда GetCurrentStackLevel вернется, возвращенный указатель будет указывать на ничейную землю. Он просто может быть использован для измерения вашего текущего уровня стека.
mr.abzadeh
Это измеряет использование стека от начала до текущей позиции, а не общее использование стека. Я не могу угадать, какая функция будет вызываться более глубоко, и системные вызовы windows api могут использовать стек, который не измеряется таким образом
МР.abzadeh
nv3
Именно это, как я думал, вас интересует, поскольку вы спросили: "сколько стека используется, когда я вызываю функцию в потоке".