Стеки потоков выделяются с помощью mmap
в начале потока (или даже раньше - вы можете установить пространство стека в pthread_attr
с). Данные TLS хранятся в начале стека потока. Размер стеков потоков фиксирован, обычно он составляет от 2 до 8 МБ. Размер стека каждого потока не может быть изменен, пока поток жив. (Первый поток, выполняющий main, все еще использует основной стек в конце адресного пространства, и этот стек может увеличиваться и уменьшаться.) Куча и код распределяются между всеми потоками. Мьютексы могут быть где угодно в секции data
- это просто структура.
Mmap стека потока не фиксируется ни по какому адресу:
Источники Glibc
mem = mmap (NULL, size, prot,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
PS современный GCC позволяет неограниченному стеку потоков с SplitStacks функция