new
e delete
sono thread-safe
Le seguenti funzioni devono essere thread-safe:
- Le versioni della libreria di
operator new
eoperator delete
- Versioni di sostituzione dell'utente di
operator new
globale eoperator delete
std::calloc
,std::malloc
,std::realloc
,std::aligned_alloc
,std::free
Le chiamate a queste funzioni che allocano o deallocano una particolare unità di archiviazione si verificano in un unico ordine totale e ciascuna di queste chiamate di deallocazione avviene prima della successiva allocazione (se presente) in questo ordine.
Con gcc, new
è implementato delegando a malloc
, e vediamo che il loro malloc
usa davvero un lucchetto. Se sei preoccupato che la tua allocazione causi colli di bottiglia, scrivi il tuo allocatore.
La risposta è sì, ma in pratica è di solito non è un problema. Se è un problema per te puoi provare a sostituire la tua implementazione di malloc con tcmalloc che riduce, ma non elimina la possibile contesa (poiché c'è solo 1 heap che deve essere condiviso tra thread e processi).
TCMalloc assegna a ogni thread una cache thread-local. Piccole allocazioni vengono soddisfatte dalla cache locale del thread. Gli oggetti vengono spostati dalle strutture di dati centrali in una cache locale del thread secondo necessità e vengono utilizzate raccolte di rifiuti periodiche per migrare la memoria da una cache locale del thread alle strutture di dati centrali.
Esistono anche altre opzioni come l'utilizzo di allocatori personalizzati e/o contenitori specializzati e/o la riprogettazione dell'applicazione.