2 votes

Les verrous sont inutiles dans NSOperationQueue ?

Je suis en train de lire le document d'Apple Concurrent Programming Guide, et je pense que OperationQueue est une série d'opérations. Le document dit que nous n'utilisons pas de verrous dans NSOperationQueue la plupart des cas.

Question

  1. Comment mettre en œuvre les tâches de lecture et d'écriture avec NSOperationQueue ?

  2. Quand utiliser les verrous dans NSOperationQueue ?

10voto

Ken Thomases Points 21131

Les files d'attente d'opérations ne sont pas nécessairement des files d'attente en série. Vous pouvez transformer une file d'attente d'opérations en file d'attente série en appelant [queue setMaxConcurrentOperationCount:1] sur elle. Sinon, par défaut, NSOperationQueue sont simultanées.

Vous devez généralement concevoir les opérations que vous soumettez aux files d'attente de manière à ce qu'elles ne nécessitent pas de verrous. C'est votre responsabilité. L'idée est que les opérations doivent être autonomes. Elles doivent être configurées avec les données dont elles ont besoin pour fonctionner avant d'être soumises à l'exécution. Ces données doivent être une copie privée ; l'opération ne doit pas y accéder en même temps que d'autres choses. Pendant l'exécution de l'opération, celle-ci ne doit travailler qu'avec ses données privées et ne doit pas accéder à d'autres parties du programme. Lorsque l'opération est terminée, elle doit mettre ses résultats à la disposition du reste du programme. (Cela peut être passif, en stockant simplement ses résultats dans l'une de ses propres propriétés. Les autres parties du programme qui ont observé l'achèvement de l'opération peuvent alors le lire. Ou cela peut être actif, où la dernière chose que fait l'opération est d'appeler un autre objet et de lui envoyer ses résultats).

NSOperationQueue ne prend pas en charge le verrouillage en lecture-écriture. Vous pouvez utiliser le pthread_rwlock API pour cela. Mais une autre solution consiste à utiliser des files d'attente de répartition GCD avec des tâches de barrière. Créez une file d'attente concurrente privée en utilisant dispatch_queue_create() . Soumettez-lui des tâches de lecture avec dispatch_[a]sync() . Soumettez-lui des tâches d'écriture en utilisant dispatch_barrier_[a]sync() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X