Почти каждые многопоточность библиотеки позволяет указать размер стека:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
__drv_aliasesMem LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
uintptr_t _beginthread( // NATIVE CODE
void( __cdecl *start_address )( void * ),
unsigned stack_size,
void *arglist
);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
Перед запуском потока операционная система выделяет память (как и malloc
) для выполнения нового потока. Некоторые системы также предоставляют промежутки («защитные страницы»), чтобы стеки не сталкивались друг с другом. Где они хранятся, зависит от платформы, но, как правило, стеки последующих потоков могут быть выделены в другой области, чем основной поток. Для Linux это обрабатывается библиотекой C и использует простой mmap
для их распределения AFAIK.