Par défaut, C n'a qu'un seul tas.
Cela dit, certains allocateurs qui sont conscients des threads partitionneront le tas afin que chaque thread ait sa propre zone à allouer. L'idée est que cela devrait améliorer l'échelle du tas.
Un exemple d'un tel tas est Hoard.
Non. Tous les threads partagent un tas commun.
Chaque thread a une pile privée, à partir de laquelle il peut rapidement ajouter et supprimer 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écursivité infinie, vous obtiendrez un débordement de pile.
Étant donné que tous les threads partagent le même tas, l'accès à l'allocateur/libérateur doit être synchronisé. Il existe diverses méthodes et bibliothèques pour éviter les conflits d'allocation.
Certains langages vous permettent de créer des pools de mémoire privés, ou des tas individuels, que vous pouvez affecter à un seul thread.