2011-01-17 8 views
11

¿El método de retención de NSObject es atómico?¿El método de retención de NSObject es atómico?

Por ejemplo, cuando se retiene el mismo objeto de dos hilos diferentes, ¿se promete que el conteo de retención ha aumentado dos veces, o es posible que el conteo de retención se incremente solo una vez?

Gracias.

Respuesta

13

NSObject así como la asignación de objetos y las funciones de conteo de retención son seguras para la ejecución de subprocesos; consulte Appendix A: Thread Safety Summary en el Thread Programming Guide.


Editar: he decidido a echar un vistazo a la parte de código abierto de la Fundación Core. En CFRuntime.c, __CFDoExternRefOperation() es la función responsable de actualizar los contadores de retención. Comprueba si el proceso tiene más de un hilo y, si hay más de un hilo, adquiere un bloqueo de giro antes de actualizar el conteo de retención, lo que hace que esta operación sea segura.

Curiosamente, el conteo de retención no es un atributo (o variable de instancia) de un objeto en el sentido struct (clase). El tiempo de ejecución mantiene una estructura separada con contadores de retención. De hecho, si lo entiendo correctamente, esta estructura es una matriz de tablas hash y hay un bloqueo de giro para cada tabla hash. Esto significa que un bloqueo se refiere a múltiples objetos que se han colocado en la misma tabla hash, es decir, el bloqueo no es global (para todas las instancias) ni por instancia.

+7

Eso es correcto. Utiliza una estrategia llamada "bloqueo de bandas" para reducir la contención en el bloqueo de retención global. Esto todavía es bastante lento, por lo que si tiene un objeto con un churn de recuento muy alto, puede valer la pena implementar un sistema de recuento personalizado. No es especialmente difícil (use OSAtomicIncrement() y sus amigos), pero perderá la capacidad de inspeccionar los historiales de recuento en Instrumentos para esos objetos. –

Cuestiones relacionadas