Colección NSMutableArray y bloques @Synchronized
En Objective C, estoy usando una instancia de NSMutableArray de varios subprocesos y estoy usando @synchronized para hacerlo seguro. Actualmente, todos mis accesos a esta matriz están protegidos con un bloque @synchronized, incluso objectAtIndex: method. Sin embargo, me pregunto qué métodos de llamada realmente necesitan estar protegidos con @synchronized. ¿Necesito proteger el acceso de lectura?
¿Qué pasaría si 'ObjectAtIndex' no está protegido y se llama al mismo tiempo que 'removeObject'?
Si todos los métodos están protegidos por un @synchronized, ¿qué pasa con el rendimiento? (Escribo un servidor de juegos tcp / udp y realmente no quiero sobreproteger esta matriz si disminuye el rendimiento o genera bloqueos).
por ejemplo, supongo que el método 'contenerObjeto:' se enumera para encontrar el objeto y que debo evitar una llamada concurrente a 'eliminarObjeto:' en otro hilo.
Quizás una buena solución sería tener bloqueos muy diferentes (para acceso de lectura y escritura) ...
Ayuda y sugerencia son bienvenidas!
Muchas gracias.
Por favor, encuentre un código de ejemplo a continuación para ilustrar:
@interface TestClass : NSObject
{
NSMutableArray * array;
}
@end
@implementation TestClass
- (id)init
{
self = [super init];
if (self)
{
array = [NSMutableArray array];
}
return self;
}
-(id)objectAtIndex:(NSUInteger)index
{
@synchronized(array) **// IS IT USEFUL OR NOT ??**
{
return [array objectAtIndex:index];
}
}
-(void)removeObject:(id)object
{
@synchronized(array)
{
[array removeObject:object];
}
}
-(void)compute
{
@synchronized(array)
{
for (id object in array)
{
[object compute];
}
}
}
@end