W Objective C Używam instancji NSMutableArray z różnych wątków i używam @synchronized, aby zapewnić bezpieczny wątek. obecnie wszystkie moje dostęp do tej tablicy są chronione przy użyciu zsynchronizowanego bloku, a nawet metody objectAtIndex :. Niemniej jednak zastanawiam się, które metody wywołania naprawdę muszą być chronione przez @synchronized. czy muszę chronić dostęp do odczytu?Kolekcja NSMutableArray i @Synchronized blocks
Co by się stało, gdyby "ObjectAtIndex" nie był chroniony i wywołany w tym samym czasie co "removeObject"?
Jeśli wszystkie metody są chronione przez @ zsynchronizowane, co z wydajnością? (I'writing serwera gry tcp/udp i naprawdę nie chcę nadopiekuły tych tablic, jeśli zmniejszyłoby to perf lub wygenerowało blokady).
na przykład Przypuszczam, że metoda "containsObject:" wyliczy, aby znaleźć obiekt i że powinienem unikać konkurentnego wywołania "removeObject:" w innym wątku.
Być może dobrym rozwiązaniem byłoby mieć też różne zamki (do odczytu i zapisu) ...
Pomoc i sugestie są mile widziane!
Wielkie dzięki.
Proszę znaleźć 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
Bardzo podoba mi się rozwiązanie GCD. Ponieważ używam wielu tablic zmiennych (i słownika), które chciałbym chronić, zastanawiam się, czy mogę stworzyć własne GCDMutableArray i GCDMutableDictionary, które zastąpią wszystkie metody i dodadzą dispatch_queue_t dla każdego wystąpienia tablicy lub słownika. Ale czy dobrym rozwiązaniem jest posiadanie 10 mutowalnych słowników z ich własnymi parametrami dispatch_queue? I utworzyć inną kolejkę w każdym przypadku? dispatch_queue_create przyjąć nazwę jako arg, jak wygenerować tę nazwę? Być może ten rodzaj chronionej tablicy i dyktatury został już napisany ... ale nie może niczego znaleźć. –
Nie sądzę, że takie klasy są ogólnie przydatne. Niemal nigdy nie można osiągnąć bezpieczeństwa wątku, koncentrując się na klasach niskiego poziomu, takich jak pojemniki. Prawie na pewno musisz analizować swoje klasy na poziomie ich abstrakcji, aby * projektować * ich interfejsy, a nie tylko ich implementacje, dla bezpieczeństwa wątków. Powiedział, że kolejki wysyłki są tanie, a Apple zachęca do tworzenia jak najwięcej rozsądnych projektów. –