Per impostazione predefinita, C ha un solo heap.
Detto questo, alcuni allocatori che sono a conoscenza del thread partizioneranno l'heap in modo che ogni thread abbia la propria area da cui allocare. L'idea è che questo dovrebbe migliorare la scala dell'heap.
Un esempio di tale mucchio è Hoard.
No. Tutti i thread condividono un heap comune.
Ogni thread ha uno stack privato, da cui può aggiungere e rimuovere rapidamente elementi. Ciò rende veloce la memoria basata sullo stack, ma se si utilizza troppa memoria dello stack, come accade nella ricorsione infinita, si otterrà un overflow dello stack.
Poiché tutti i thread condividono lo stesso heap, l'accesso all'allocatore/deallocatore deve essere sincronizzato. Esistono vari metodi e librerie per evitare la contesa dell'allocatore.
Alcuni linguaggi ti consentono di creare pool privati di memoria, o singoli heap, che puoi assegnare a un singolo thread.