Темы делятся всем [1]. Есть одно адресное пространство для всего процесса.
Каждый поток имеет свой собственный стек и регистры, но стеки всех потоков видны в общем адресном пространстве.
Если один поток выделяет некоторый объект в своем стеке и отправляет адрес другому потоку, они оба будут иметь равный доступ к этому объекту.
На самом деле, я только что заметил более широкую проблему: я думаю, что вы путаете два использования слова « сегмент» .
Формат файла для исполняемого файла (например, ELF) содержит отдельные разделы, которые могут называться сегментами, содержащими скомпилированный код (текст), инициализированные данные, символы компоновщика, отладочную информацию и т. Д. Сегменты кучи или стека отсутствуют. здесь, так как это только конструкции времени выполнения.
Эти двоичные сегменты файла могут отображаться в адресное пространство процесса отдельно с различными разрешениями (например, исполняемый файл только для чтения для кода / текста и неисполняемый файл для копирования при записи для инициализированных данных).
Области этого адресного пространства используются для различных целей, таких как выделение кучи и стек потоков, согласно соглашению (обеспечивается вашими языковыми библиотеками времени выполнения). Это все только память, и, вероятно, не сегментированная, если вы не работаете в режиме виртуального 8086. Стек каждого потока представляет собой кусок памяти, выделенный во время создания потока, с текущим верхним адресом стека, хранящимся в регистре указателя стека, и каждый поток сохраняет свой собственный указатель стека вместе со своими другими регистрами.
[1] Хорошо, я знаю: маски сигналов, TSS / TSD и т. Д. Адресное пространство, включая все отображаемые сегменты программы, все еще используется совместно.