new e delete sono thread-safe
Le seguenti funzioni devono essere thread-safe:
- Le versioni della libreria di
operator neweoperator delete- Versioni di sostituzione dell'utente di
operator newglobale eoperator deletestd::calloc,std::malloc,std::realloc,std::aligned_alloc,std::freeLe 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.