NSMutableDictionary fil de sécurité
J'ai une question sur le thread de sécurité lors de l'utilisation NSMutableDictionary
.
Le thread principal est la lecture des données à partir de NSMutableDictionary
où:
- clé est
NSString
- valeur est
UIImage
Un thread asynchrone est de l'écriture des données ci-dessus dictionnaire (à l'aide de NSOperationQueue
)
Comment je fais les au-dessus de dictionnaire thread-safe?
Devrais-je faire la NSMutableDictionary
propriété atomic
? Ou ai-je besoin d'apporter des modifications supplémentaires?
@property(retain) NSMutableDictionary *dicNamesWithPhotos;
- Je ne suis pas expert sur le multithreading, mais je sais que le "atomique" drapeau (la valeur par défaut pour @synthétiser avais accesseurs) ne donne aucune garantie de la sécurité des threads. J'ai pensé la même chose quand j'ai lu à ce sujet, cependant.
Vous devez vous connecter pour publier un commentaire.
NSMutableDictionary
n'est pas conçu pour être thread-safe structure de données, et de simplement marquer la propriétéatomic
, ne garantit pas que les données sous-jacentes des opérations s'effectue automatiquement (de manière sécurisée).Pour s'assurer que chaque opération est faite de façon sécuritaire, vous auriez besoin de garde de chaque opération sur le dictionnaire avec une serrure:
Vous devriez envisager de déployer votre propre
NSDictionary
que, tout simplement, les délégués des appels à NSMutableDictionary tout en maintenant un verrou:Veuillez noter que parce que chaque opération nécessite d'attente pour le verrouiller et de le tenir, il n'est pas évolutive, mais il pourrait être assez bon dans votre cas.
Si vous souhaitez utiliser un bon filetée de la bibliothèque, vous pouvez utiliser TransactionKit bibliothèque comme ils l'ont
TKMutableDictionary
qui est un multi-thread safe bibliothèque. Personnellement, je ne l'ai pas utilisé, et il semble que c'est un travail en cours de la bibliothèque, mais vous pourriez vouloir donner un essai."expected ')' before 'retval_t'"
sur la ligne- (retval_t) forward: (SEL) sel : (arglist_t) args
des idées?@synchronized
d'être plus pratique que d'essayer explicitement de verrouillage/déverrouillage.@synchronized
fait pour vous sans frais puisque nous sommes juste verrouillage de l'accès au dictionnaire et de ne pas discerner si c'est un get/set opération.après un peu de recherche, j'ai envie de partager avec vous cet article :
À l'aide de classes de collection en toute sécurité avec les applications multithread
http://developer.apple.com/library/mac/#technotes/tn2002/tn2059.html
Il ressemble notnoop la réponse peut ne pas être une solution, après tout. De filetage perspective, il est ok, mais il y a certaines subtilités. Je ne vais pas poster ici une solution mais je pense qu'il y a un bon dans cet article.
[[[dict objectForKey:key] retain] autorelease]
"truc" est vraiment nécessaire dans un environnement multithread.J'ai deux options à l'aide de nsmutabledictionary.
Est:
Deux:
Je ne sais pas pourquoi certaines personnes veulent écraser le réglage et l'obtention de mutabledictionary.
Même la réponse est correcte, il est un élégant et autre solution:
La copie est important lors de l'utilisation de thread objets dangereux, avec ce que vous pourriez éviter l'erreur possible en raison de la dissémination involontaire de la variable. Pas besoin de thread-safe entités.
Si plus de file d'attente voudrais utiliser la NSMutableDictionary déclarer une file d'attente privée et modifier le setter pour:
IMPORTANT!
Vous devez définir une file d'attente privée, sans elle, l' dispatch_barrier_sync est juste un simple dispatch_sync
Explication détaillée est dans ce merveilleux article du blog.
Aujourd'hui tu serais probablement aller pour
@synchronized(object)
à la place.Pas besoin de la
NSLock
objet plus