Kolekcja NSMutableArray i bloki @Synchronized
W Objective C używam instancji NSMutableArray z różnych wątków i używam @synchronized, aby uczynić go wątkiem bezpiecznym. obecnie wszystkie moje dostępu do tej tablicy są chronione blokiem @synchronizowanym, nawet objectAtIndex: method. Niemniej jednak zastanawiam się, które metody wywołania naprawdę wymagają ochrony za pomocą @synchronized. czy muszę chronić dostęp do odczytu?
Co by się stało, gdyby obiekt „ObjectAtIndex” nie był chroniony i wywoływał jednocześnie „removeObject”?
Jeśli wszystkie metody są chronione przez synchronizację @ co z wydajnością? (Piszę serwer gier tcp / udp i naprawdę nie chcę nadmiernie chronić tych tablic, jeśli zmniejszy to perf lub wygeneruje blokady).
na przykład przypuszczam, że metoda 'includesObject:' wyliczy, aby znaleźć obiekt i że powinienem unikać wywołania concurent do 'removeObject:' w innym wątku.
Być może dobrym rozwiązaniem byłoby posiadanie zbyt różnych blokad (do odczytu i zapisu) ...
Pomoc i sugestie są mile widziane!
Wielkie dzięki.
Znajdź przykładowy kod poniżej, aby zilustrować:
@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