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