Breve introduzione: Sto lavorando su un codice multithread e devo condividere oggetti allocati dinamicamente tra due thread. Per rendere il mio codice più pulito (e meno soggetto a errori), voglio "cancellare" esplicitamente gli oggetti in ogni thread ed è per questo che voglio usare shared_ptr
.Overhead e implementazione dell'utilizzo di shared_ptr
Prima domanda:
Voglio sapere se l'attuazione di -> operator
in shared_ptr
ha un certo overhead in più (per esempio più grande allora unique_ptr
) durante la fase di esecuzione. Gli oggetti di cui sto parlando sono in genere istanze longlife copiate solo una volta dopo la creazione (quando li distribuisco tra i thread), quindi accedo solo ai metodi e ai campi di questi oggetti.
Sono consapevole che lo shared_ptr
protegge solo il conteggio dei riferimenti.
Seconda domanda:
Quanto bene sono shared_ptr
ottimizzati in libstdC++? Utilizza sempre il mutex o sfrutta le operazioni atomiche (mi concentro sulle piattaforme x86 e ARM)?
In una buona implementazione di 'shared_ptr', ci dovrebbe essere zero overhead durante il dereferenziamento del puntatore tramite' -> '. Non ho familiarità con libstdC++, quindi non posso rispondere alla tua seconda domanda. Hai le intestazioni, però, in modo che tu possa facilmente scoprire dando un'occhiata a come è implementato. –
Se il codice è multithread, il puntatore condiviso di GCC usa uno 'std :: atomic' o qualcosa del genere per il contatore di riferimento; che si tratti di un atomico hardware (senza blocco) reale dipende dalla versione del compilatore - credo che sia stato migliorato in GCC 4.7.0. –
Copia/assegnazione/uscita dall'ambito ha un overhead aggiuntivo a causa dell'incremento del thread-count del conto. 'operator->' sembra esattamente uguale a quello del buon vecchio 'auto_ptr', cioè ci si può aspettare un sovraccarico pari a zero. – Damon