2012-08-04 6 views
5

En el desarrollo de aplicaciones iOS, estamos usando NSAutoreleasePool para renunciar a la propiedad de los objetos en un momento posterior.¿Por qué necesitamos usar NSAutoreleasepool para cada hilo?

¿Pero por qué se puede compartir entre diferentes subprocesos?

¿Por qué tenemos que crear un nuevo autoreleasepool cuando quería usar un nuevo hilo?

EDIT:

Como taskinoor mencionado mi pregunta era por qué esto está diseñado de tal manera que cada hilo debe tener un autoreleasepool separada.

+1

[Esta pregunta parece muy relacionada con su pregunta] (http://stackoverflow.com/questions/4547652/does-every-thread-need-its-own-autorelease-pool) –

+1

Debería pensar en usar '@ autoreleasepool {...} 'en lugar de' NSAutoreleasePool'. De acuerdo con la documentación, es más eficiente. Y si migras a ARC, es obligatorio. –

+0

No sé por qué necesita esa edición, mi respuesta explica el motivo :) –

Respuesta

5

El desafío de diseño para las agrupaciones de autorrelease de múltiples hilos es cuándo drenarlos. Si drena la piscina mientras un objeto todavía se está utilizando, se bloqueará. Según el hilo, es fácil saber cuándo se encuentra fuera del ciclo de ejecución y, por lo tanto, en un punto en el que los objetos liberados automáticamente se pueden drenar. En una situación de múltiples hilos, sus hilos necesitarían estar sincronizados al final de su recorrido para que pueda estar seguro de que está en un punto seguro para drenarlos. Las huellas sincronizadas de esta manera son una mala idea, crean mucho tiempo de inactividad y ralentizan el programa.

+1

Da un paso más; si algún hilo está bloqueado esperando algo - red, estado del hilo, otra E/S - entonces el conjunto general no podría ser drenado. – bbum

0

No creo que las piscinas autorelease son compartidos entre los hilos, de acuerdo con apples memory management guide en Cocoa cada hilo tiene su propia pila de piscinas autorelease

Si no se crea una piscina autorelease de hilos que se crean o separar, entonces la función de liberación automática no funciona, por lo que la huella de memoria crecerá

2

Cada subproceso tiene un contexto de ejecución diferente: un subproceso puede salir tarde o temprano, pueden usar diferentes recursos con diferentes vidas y necesidades de administración de memoria, por lo que cada hilo debe ser administrado de forma independiente.

1

Porque diseñaron de esta manera. Supongo que tu pregunta es por qué diseñaron de esta manera. No estoy 100% seguro, pero una posible razón puede ser que el hecho de compartir un recurso entre subprocesos tiene su costo. Durante cada modificación en el conjunto compartido, cada subproceso tendrá que bloquear y desbloquear lo que reducirá el rendimiento. Un recurso se debe compartir en varios subprocesos solo si es necesario compartirlo, que no es el caso con los grupos de liberación automática. El uso del pool de autorrelease dedicado tendrá un mejor rendimiento. Esta podría ser una de las posibles razones para esta decisión de diseño.

+0

Gracias Taskinoor – Krishnan

+1

Buena conjetura, pero incompleta. Los grupos Autorelease deben ser por subproceso porque no habría forma de drenar el grupo de forma segura sin que * todos los subprocesos * estuvieran en un estado en el que su grupo podría agotarse. Si * cualquier hilo * está bloqueado esperando la entrada, entonces el drenaje no podría suceder. La respuesta de Jeffeery es correcta. – bbum

+1

@bbum, gracias. No pensé en agotar el pozo y estoy de acuerdo en que la respuesta de Jeffery es mejor que la mía. – taskinoor

Cuestiones relacionadas