Threads teilen alles [1]. Es gibt einen Adressraum für den gesamten Prozess.
Jeder Thread hat seinen eigenen Stapel und seine eigenen Register, aber alle Stapel der Threads sind im gemeinsam genutzten Adressraum sichtbar.
Wenn ein Thread ein Objekt auf seinem Stapel zuweist und die Adresse an einen anderen Thread sendet, haben beide den gleichen Zugriff auf dieses Objekt.
Eigentlich ist mir gerade ein größeres Problem aufgefallen: Ich denke, Sie verwechseln zwei Verwendungen des Wortsegments .
Das Dateiformat für eine ausführbare Datei (z. B. ELF) enthält unterschiedliche Abschnitte, die als Segmente bezeichnet werden können und kompilierten Code (Text), initialisierte Daten, Linkersymbole, Debug-Informationen usw. enthalten. Es gibt keine Heap- oder Stapelsegmente hier, da dies nur Laufzeitkonstrukte sind.
Diese binären Dateisegmente können separat mit unterschiedlichen Berechtigungen in den Prozessadressraum abgebildet werden (z. B. schreibgeschützt ausführbar für Code / Text und nicht ausführbar kopierbar beim Schreiben für initialisierte Daten).
Bereiche dieses Adressraums werden gemäß Konvention (von Ihren Sprachlaufzeitbibliotheken erzwungen) für verschiedene Zwecke verwendet, z. B. Heap-Zuweisung und Thread-Stapel. Es ist jedoch alles nur Speicher und wahrscheinlich nicht segmentiert, es sei denn, Sie arbeiten im virtuellen 8086-Modus. Der Stapel jedes Threads ist ein Speicherblock, der zum Zeitpunkt der Thread-Erstellung zugewiesen wird, wobei die aktuelle Stapeloberadresse in einem Stapelzeigerregister gespeichert ist und jeder Thread seinen eigenen Stapelzeiger zusammen mit seinen anderen Registern behält.
[1] OK, ich weiß: Signalmasken, TSS / TSD usw. Der Adressraum einschließlich aller zugeordneten Programmsegmente wird jedoch weiterhin gemeinsam genutzt.