Ci sono tonnellate di domande su come implementare i contatori di riferimento thread-safe. E una risposta molto votata comune è: "usa incremento/decremento atomico". Ok, questo è un buon modo per leggere e scrivere refCounter mentre altri thread lo cambiano in mezzo. Ma.Un'altra domanda sul conteggio dei riferimenti sicuri dei thread
Il mio codice è:
void String::Release()
{
if (0 == AtomicDecrement(&refCounter)))
delete buffer;
}
So. Decremento e leggo refCounter in sicurezza. Ma cosa succede se l'altro thread INCREMENTO il mio RefCounter mentre lo sto confrontando a zero ????
Mi sbaglio?
EDIT: (esempio)
String* globalString = new String(); // refCount == 1 after that.
// thread 0:
delete globalString;
// This invokes String::Release().
// After AtomicDecrement() counter becomes zero.
// Exactly after atomic decrement current thread switches to thread 1.
// thread 1:
String myCopy = *globalString;
// This invokes AddRef();
// globalString is alive;
// internal buffer is still not deleted but refCounter is zero;
// We increment and switch back to thread 0 where buffer will be
// succefully deleted;
mi sbaglio?
Come può un altro thread incrementare il contatore, se non ha un riferimento all'oggetto ? Un valore di 0 significa letteralmente "nessun riferimento lasciato". –