Está comparando un bloqueo global (un bloqueo para todas las instancias) con un bloqueo recursivo a nivel de objeto (un bloqueo por instancia, que puede adquirirse varias veces desde el mismo subproceso). En general, estos no son intercambiables; funcionan y se protegen de forma muy diferente.
La buena noticia es que puede usar pthread_mutex_t
como un bloqueo recursivo que es exclusivo de cada instancia con el fin de lograr el mismo grado de protección que @synchronized
. Usar pthread_mutex_t
también hace que las adquisiciones de bloqueos sean mucho, mucho más rápidas.
Para lograr el mismo efecto que @synchronized
usando un mutex pthread, declare pthread_mutex_t gLock
como una variable de instancia, inícielo como un mutex recursivo en -init
. Finalmente, destruya el mutex en -dealloc
.
Por supuesto, las clases sub y base pueden necesitar acceso a este bloqueo si se basaron en la semántica de @synchronized
para hacer lo correcto a través de la jerarquía de objetos.
@synchronized
es veeeeeeery lento en comparación con un mutex pthread recursivo (la última vez que lo comprobé).
En. Archivo \t pthread_mutexattr_t attr; \t pthread_mutex_t mutex; en init \t \t pthread_mutexattr_settype (& attr, PTHREAD_MUTEX_RECURSIVE); \t \t pthread_mutex_init (y exclusión mutua, &attr); en dealloc pthread_mutex_destroy (y mutex); en mi pthread_mutex_lock función (y mutex); \t \t \t \t CFSetRemoveAllValues (MySet); \t \t \t pthread_mutex_unlock (y mutex); es ¿Esta multa? –
@ParagBafna a) el mutex attr puede ser 'estático', y se usa para cada mutex que cree, o no estático y se usa solo en' -init' b) el mutex attr no necesita ser un ivar c) debe verificar su códigos de resultado d) también puede preferir 'pthread_mutex_trylock' en algunos casos. e) debes inicializar las estructuras usando los inicializadores. ¡Aparte de eso, se ve bien! prepárese para el bloqueo rápido =) – justin
los códigos de resultado son útiles principalmente para detectar errores de bloqueo y enhebrado. – justin