Pour autant que je sache, chaque thread reçoit une pile distincte lorsqu'il est créé par le système d'exploitation. Je me demande si chaque thread a également une pile distincte ?
Réponses
Trop de publicités?Non. Tous les threads partagent un tas commun.
Chaque le fil a une pile privée qui permet d'ajouter et de retirer rapidement des éléments. Cela rend la mémoire basée sur la pile rapide, mais si vous utilisez trop de mémoire de pile, comme cela se produit dans la récursion infinie, vous obtiendrez un débordement de pile.
Comme tous les threads partagent le même tas, l'accès à l'allocateur/désallocateur doit être synchronisé. Il existe plusieurs méthodes et bibliothèques pour éviter contention de l'allocateur .
Certains langages vous permettent de créer des pools de mémoire privés, ou heaps individuels, que vous pouvez attribuer à un seul thread.
Par défaut, C n'a qu'un seul tas.
Cela dit, certains allocateurs qui tiennent compte des threads partitionnent le tas de sorte que chaque thread dispose de sa propre zone d'allocation. L'idée est que cela devrait permettre au tas de mieux s'adapter.
Un exemple d'un tel tas est Hoard .
Cela dépend du système d'exploitation. Le runtime c standard sous Windows et unices utilise un tas partagé entre les threads. Cela signifie qu'il faut verrouiller chaque malloc/free.
Sur Symbian, par exemple, chaque thread dispose de son propre tas, bien que les threads puissent partager des pointeurs vers des données allouées dans n'importe quel tas. La conception de Symbian est meilleure à mon avis, car elle élimine non seulement le besoin de verrouillage pendant l'allocation/la libération, mais encourage également une spécification propre de la propriété des données entre les threads. De plus, dans ce cas, lorsqu'un thread meurt, il emporte avec lui tous les objets qu'il a alloués - c'est-à-dire qu'il ne peut pas faire fuir les objets qu'il a alloués, ce qui est une propriété importante pour les appareils mobiles dont la mémoire est limitée.
Erlang suit également une conception similaire où un "processus" agit comme une unité de collecte des déchets. Toutes les données sont communiquées entre les processus par copie, à l'exception des blobs binaires qui sont comptés par référence (je pense).
Cela dépend de ce que vous entendez exactement par "tas".
Tous les threads partagent l'espace d'adressage, de sorte que les objets alloués au tas sont accessibles à tous les threads. Techniquement, les piles sont également partagées dans ce sens, c'est-à-dire que rien ne vous empêche d'accéder à la pile d'un autre thread (même si cela n'aurait presque jamais de sens de le faire).
D'autre part, il existe un tas structures utilisé pour allouer de la mémoire. C'est là que s'effectue toute la comptabilité de l'allocation de la mémoire du tas. Ces structures sont organisées de manière sophistiquée afin de minimiser les conflits entre les threads. Ainsi, certains threads peuvent partager une structure de tas (une arène), et d'autres peuvent utiliser des arènes distinctes.
Voir le fil de discussion suivant pour une excellente explication des détails : Comment fonctionne malloc dans un environnement multithread ?