Les discussions partagent tout [1]. Il existe un espace d'adressage pour l'ensemble du processus.
Chaque thread a sa propre pile et ses propres registres, mais les piles de tous les threads sont visibles dans l'espace d'adressage partagé.
Si un thread alloue un objet sur sa pile et envoie l'adresse à un autre thread, ils auront tous deux un accès égal à cet objet.
En fait, je viens de remarquer un problème plus large: je pense que vous confondez deux utilisations du segment de mot .
Le format de fichier d'un exécutable (par exemple, ELF) comporte des sections distinctes, qui peuvent être appelées segments, contenant du code compilé (texte), des données initialisées, des symboles de l'éditeur de liens, des informations de débogage, etc. Il n'y a pas de segments de tas ou de pile. ici, car ce sont des constructions uniquement à l'exécution.
Ces segments de fichiers binaires peuvent être mappés séparément dans l'espace d'adressage du processus, avec des autorisations différentes (par exemple, un exécutable en lecture seule pour le code / texte et un non exécutable en copie sur écriture pour les données initialisées).
Les zones de cet espace d'adressage sont utilisées à des fins différentes, comme l'allocation de segments de mémoire et les piles de threads, par convention (appliquées par vos bibliothèques d'exécution de langage). Cependant, il ne s'agit que de mémoire et probablement pas segmenté, sauf si vous exécutez en mode 8086 virtuel. La pile de chaque thread est un bloc de mémoire alloué au moment de la création du thread, l'adresse de la pile actuelle étant stockée dans un registre de pointeur de pile, et chaque thread conserve son propre pointeur de pile avec ses autres registres.
[1] D'accord, je sais: masques de signaux, TSS / TSD etc. L'espace d'adressage, y compris tous ses segments de programme mappés, est cependant toujours partagé.