2011-01-17 15 views
11

Il metodo di conservazione di NSObject è atomico?Il metodo di conservazione di NSObject è atomico?

Ad esempio, quando si conserva lo stesso oggetto da due thread diversi, è stato promesso che il conteggio di ritenzione è salito due volte oppure è possibile che il conteggio di ritenzione sia incrementato una sola volta?

Grazie.

risposta

13

NSObject così come l'assegnazione degli oggetti e le funzioni di conteggio dei fermi sono thread-safe - vedere Appendix A: Thread Safety Summary nello Thread Programming Guide.


Edit: ho deciso di dare uno sguardo alla parte open source del Nucleo Fondazione. In CFRuntime.c, __CFDoExternRefOperation() è la funzione responsabile dell'aggiornamento dei contatori di ritenzione. Verifica se il processo ha più di un thread e, se c'è più di un thread, acquisisce uno spin lock prima di aggiornare il conteggio dei ritardi, rendendo quindi questa operazione sicura.

È interessante notare che il conteggio dei ritiri non è un attributo (o una variabile di istanza) di un oggetto nel senso struct (classe). Il runtime mantiene una struttura separata con i contatori di ritenzione. Infatti, se ho capito bene, questa struttura è una matrice di tabelle hash e c'è un blocco di selezione per ogni tabella hash. Ciò significa che un lucchetto si riferisce a più oggetti che sono stati collocati nella stessa tabella hash, cioè il blocco non è globale (per tutte le istanze) né per istanza.

+7

Questo è corretto. Usa una strategia chiamata "lock striping" per ridurre la contesa sul blocco di mantenimento globale. Questo è ancora piuttosto lento, quindi se si dispone di un oggetto con un numero elevato di abbandoni, può essere utile implementare un sistema di conteggio personalizzato. Non è particolarmente difficile (usa OSAtomicIncrement() e gli amici), ma perderai la possibilità di ispezionare le cronologie dei conti in Strumenti per quegli oggetti. –

Problemi correlati