NSMutableDictionary
nie jest przeznaczony do struktury danych wątku bezpieczny, a po prostu oznaczenie nieruchomości jako atomic
, nie gwarantuje, że podstawowe operacje na danych są faktycznie wykonywane atomowo (w bezpieczny sposób).
Aby upewnić się, że każda operacja jest wykonywana w sposób bezpieczny, trzeba by pilnować każdej operacji na słowniku z zamkiem:
// in initialization
self.dictionary = [[NSMutableDictionary alloc] init];
// create a lock object for the dictionary
self.dictionary_lock = [[NSLock alloc] init];
// at every access or modification:
[object.dictionary_lock lock];
[object.dictionary setObject:image forKey:name];
[object.dictionary_lock unlock];
Należy rozważyć toczenia własne NSDictionary
które po prostu delegatów wzywa do NSMutableDictionary trzymając lock:
@interface SafeMutableDictionary : NSMutableDictionary
{
NSLock *lock;
NSMutableDictionary *underlyingDictionary;
}
@end
@implementation SafeMutableDictionary
- (id)init
{
if (self = [super init]) {
lock = [[NSLock alloc] init];
underlyingDictionary = [[NSMutableDictionary alloc] init];
}
return self;
}
- (void) dealloc
{
[lock_ release];
[underlyingDictionary release];
[super dealloc];
}
// forward all the calls with the lock held
- (retval_t) forward: (SEL) sel : (arglist_t) args
{
[lock lock];
@try {
return [underlyingDictionary performv:sel : args];
}
@finally {
[lock unlock];
}
}
@end
Należy pamiętać, że ponieważ każda operacja wymaga oczekiwania na blokady i przytrzymując go, to nie dość skalowalne, ale może to być wystarczająco dobre w Twoim przypadku.
Jeśli chcesz użyć odpowiedniej biblioteki z gwintami, możesz użyć TransactionKit library, ponieważ mają one TKMutableDictionary
, która jest wielowątkową bezpieczną biblioteką. Osobiście go nie używałem i wygląda na to, że jest to biblioteka postępu, ale możesz spróbować.
Nie jestem ekspertem od wielowątkowości, ale wiem, że flaga "atomowa" (domyślna dla @ synthesize'd accessorów) nie gwarantuje bezpieczeństwa wątku. Myślałem o tym samym, kiedy po raz pierwszy przeczytałem o tym. –