スレッドはすべてを共有します [1]。プロセス全体に1つのアドレススペースがあります。
各スレッドには独自のスタックとレジスタがありますが、すべてのスレッドのスタックは共有アドレス空間に表示されます。
あるスレッドがスタックにオブジェクトを割り当て、そのアドレスを別のスレッドに送信すると、どちらのスレッドもそのオブジェクトに同等にアクセスできます。
実際、もっと広い問題に気づきました。「セグメント」という2つの使い方を混同していると思います。
実行可能ファイル(ELFなど)のファイル形式には、コンパイル済みコード(テキスト)、初期化されたデータ、リンカーシンボル、デバッグ情報などを含む、セグメントと呼ばれる可能性のある別個のセクションがあります。ヒープまたはスタックセグメントはありません。ここでは、これらは実行時のみの構成であるためです。
これらのバイナリファイルセグメントは、異なるアクセス許可(たとえば、コード/テキストの読み取り専用実行可能ファイル、および初期化されたデータのコピーオンライト非実行可能ファイル)を使用して、プロセスアドレス空間に個別にマッピングできます。
このアドレススペースの領域は、ヒープ割り当てやスレッドスタックなど、さまざまな目的で使用されます(言語ランタイムライブラリによって強制されます)。ただし、これは単なるメモリであり、仮想8086モードで実行している場合を除いて、おそらくセグメント化されません。各スレッドのスタックは、スレッドの作成時に割り当てられたメモリのチャンクであり、現在のスタックトップアドレスはスタックポインターレジスタに格納され、各スレッドは独自のスタックポインターを他のレジスタと共に保持します。
[1]はい、わかりました:シグナルマスク、TSS / TSDなど。ただし、マップされたすべてのプログラムセグメントを含むアドレス空間は引き続き共有されます。