2015-04-09 85 views
11

Ecco alcuni snippet di codice.È condiviso il thread di scambio shared_ptr?

std::shared_ptr<int> global(new int(1)); 


void swapper(int x) 
{ 
    std::shared_ptr<int> sp(new int(x)); 
    global.swap(sp); 
} 

supponga di voler chiamare swapper in thread paralleli. Sarebbe sicuro?

Sono a conoscenza di questo answer. Mostra come l'assegnazione del puntatore non è thread-safe se riassegno un valore a global.

La mia domanda è se la funzione membro swap è in sé thread-safe.

Da un lato le funzioni del blocco di controllo di shared_ptr sono thread-safe. D'altra parte presumo che io stia girando i puntatori ai blocchi di controllo, quindi non dovrebbe essere thread-safe.

Qual è la connessione lì? Il thread swap è sicuro?

+0

Senza l'uso di 'swap', questa funzione dovrebbe probabilmente assomigliare a' global.reset (new int (x)) '. – Barry

+1

@Barry: non se vuoi che sia thread-safe. –

risposta

16

No, swap non è thread-safe, ma c'è un'altra funzione che è:

atomic_store(&global, sp); 

C'è anche atomic_exchange che restituisce il vecchio valore, se avete bisogno di questo.

+0

['atomic_exchange'] (http://en.cppreference.com/w/cpp/atomic/atomic_exchange)? Ma abbiamo a che fare con 'shared_ptr'. – Barry

+5

@Barry: No, ['atomic_exchange'] (http://en.cppreference.com/w/cpp/memory/shared_ptr/atomic). –

+0

Allora è più sensato! – Barry