Ответ
При создании нового потока (например, с помощью pthread_create() или std::thread) в рамках существующего процесса операционная система выделяет для него новый регион памяти под стек. Размер стека по умолчанию обычно составляет от 1 до 8 МБ (зависит от ОС и может настраиваться через атрибуты потока).
Ключевое разделение памяти в многопоточном процессе:
- Разделяемые всеми потоками:
- Сегмент кода (
.text) — исполняемые инструкции программы. - Сегмент данных (глобальные и статические переменные).
- Куча (heap) — память, выделяемая через
malloc()/new.
- Сегмент кода (
- Уникальные для каждого потока:
- Стек (stack) — содержит локальные переменные, аргументы функций и информацию о вызовах (call stack).
- Thread-Local Storage (TLS) — область для переменных, объявленных с
thread_localв C++11.
Пример, демонстрирующий разные стеки:
#include <iostream>
#include <thread>
void thread_func() {
int local_to_thread = 42; // Живёт в стеке нового потока
std::cout << "Thread stack address: " << &local_to_thread << 'n';
}
int main() {
int local_to_main = 10; // Живёт в стеке главного потока
std::cout << "Main stack address: " << &local_to_main << 'n';
std::thread t(thread_func);
t.join();
}
// Адреса &local_to_main и &local_to_thread будут значительно различаться.