2012-08-12 20 views
10

Comencé a controlar las colas por primera vez y siento que tengo una buena idea de cómo usarlas y felicitaciones a Apple por hacerlas bastante sencillas de usar.@synchronized vs GCD dispatch_barrier_async

Lo que encontré, sin embargo, es el desafío de múltiples hilos para leer y escribir en los mismos objetos. En this question obtuve this fine answer, y me deja pidiendo alguna confirmación de parte de todos para asegurarme de que entiendo los pros y los contras de @synchronized contra GCD dispatch_barrier_async.

Esta es la forma en que lo veo:

@synchronized 

PRO: Usted puede envolver cualquier objeto en @synchronized, siempre y cuando tenga acceso/puntero a ella, por lo que es fácil para los modelos de datos compartidos que sean manejado con seguridad de diferentes objetos en el programa

PRO: con el apoyo de iOS 4 (y quizás antes)

`dispatch_barrier_async` with custom DISPATCH_QUEUE_CONCURRENT 

PRO: no DISPATCH_QUEUE_CONCURRENT sólo está disponible en iOS 5 (como se discutió here), por lo que está disponible para iOS de soporte 4

CON:: es más rápido que @synchronized

CON No es tan fácil utilizar al controlar la lectura/escritura en un objeto de muchos otros objetos, ya que las colas están más fácilmente disponibles solo para el objeto que las crea (sin trabajar para evitar esta limitación)

En resumen, la mejor herramienta depende de las necesidades del programa, en consideración de lo anterior.

Si alguien tiene algo que agregar o señalar, lo agradecería.

Respuesta

3

Bueno, algunas cosas a destacar:

1) Cuando se utiliza el @synchronized, se tira en el marco TODA excepción para iOS (o OSX) para una aplicación. Sé de esto en OSX y tiene un impacto en el rendimiento allí, no puedo asegurarlo en iOS pero esperaría lo mismo. Dicho esto, esto es utilizar un martillo para clavar un clavo: esa capacidad estaba cerca antes de que otras opciones estuvieran disponibles. Yo personalmente evito su uso como la plaga, y he portado otros marcos de código abierto para usar semáforos de despacho (le agradezco a Mike Ash (otra vez) por eso!)

2) Su comentario sobre "DISPATCH_QUEUE_CONCURRENT" es una especie de arenque del género - desde iOS 4, el sistema te ha otorgado 3 colas simultáneas, por lo que realmente estás empujando el sobre si necesitas definir el tuyo. Con el envío, tiene grupos asincrónicos y sincronizados, en serie y simultáneos, que puede esperar y despachar después. Hay tanta riqueza aquí, ¿cómo podrías siquiera pensar en 1). ¡Cuanto más uses bloques, más los usarás!

EDIT: utilicé colas simultáneas personalizadas en mi aplicación iOS 4.3, junto con todas las técnicas de barrera de Mike Ash. La cola.El archivo h lo muestra como disponible:

__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0) 
DISPATCH_EXPORT DISPATCH_CONST DISPATCH_WARN_RESULT DISPATCH_NOTHROW 
dispatch_queue_t 
dispatch_get_global_queue(dispatch_queue_priority_t priority, unsigned long flags); 

/*! 
* @const DISPATCH_QUEUE_SERIAL 
* @discussion A dispatch queue that invokes blocks serially in FIFO order. 
*/ 
#define DISPATCH_QUEUE_SERIAL NULL 

/*! 
* @const DISPATCH_QUEUE_CONCURRENT 
* @discussion A dispatch queue that may invoke blocks concurrently and supports 
* barrier blocks submitted with the dispatch barrier API. 
*/ 
#define DISPATCH_QUEUE_CONCURRENT (&_dispatch_queue_attr_concurrent) 
+2

Su punto 2) no se aplica a dispatch_barrier, ya que no puede usar esto en una cola global, solo una cola simultánea personalizada. Para la lectura/escritura segura de hilos mediante el mecanismo GCD, necesita una cola simultánea personalizada. Descrito aquí: http://www.mikeash.com/pyblog/friday-qa-2011-10-14-whats-new-in-gcd.html – johnbakers

+0

He editado mi respuesta: utilicé las técnicas de Mike Ash en mi iOS 4.3 aplicación, así que estoy seguro de las barreras donde hay colas concurrentes. –

+0

esto es interesante, en otra cuestión mía y también en el sitio de Ash, todas las colas simultáneas personalizadas solo estuvieron de acuerdo en iOS 5 y posteriores; estás sugiriendo lo contrario. las colas simultáneas globales siempre han estado disponibles, pero todos tienen la impresión de que las colas simultáneas personalizadas son una adición muy reciente a iOS (aunque han estado en OS X anteriormente) – johnbakers

Cuestiones relacionadas