Que signifie la propriété «Nonatomique»?


144

Que signifie «non atomique» dans ce code?

@property(nonatomic, retain) UITextField *theUsersName;

Quelle est la différence entre atomique et non atomique?

Merci


3
Désolé, j'ai oublié de spécifier que c'est en Objective-c (cacao)

Veuillez également lire ce lien - stackoverflow.com/questions/588866/…
Vijayendra

Pour tous ceux qui liront ceci, pour 2014, il est important de se rendre compte que beaucoup de ces informations sont extrêmement dépassées. Il n'y a, en un mot, aucune raison d'utiliser le non-atomique et il est fondamentalement faux de l'utiliser, pour quelque raison que ce soit. c'est de l'histoire ancienne. Nonatomic signifie "mode thread unsafe" et est (en un mot) maintenant totalement hors de propos. Quelques commentaires ici stackoverflow.com/q/23977765/294884
Fattie

Je ne suis pas d'accord avec l'affirmation «non pertinente». Si la valeur change rarement et comme l'exemple dans le document Apple est le nom de famille. Il change une fois, puis l'utilisation d'un indice atomique est un gaspillage de ressources impliquées puisque les vérifications ne sont pas nécessaires.
Nick Turner

Réponses:


268

Jetez un œil aux documents Apple .

Fondamentalement, si vous dites nonatomicet que vous générez les accesseurs en utilisant @synthesize, alors si plusieurs threads essaient de modifier / lire la propriété à la fois, une mauvaise chose peut se produire. Vous pouvez obtenir des valeurs partiellement écrites ou des objets surdimensionnés / conservés, ce qui peut facilement entraîner des plantages. (Ceci est potentiellement beaucoup plus rapide qu'un accesseur atomique, cependant.)

Si vous utilisez la valeur par défaut (qui est atomic; il n'y avait pas de mot-clé pour cela, mais il y en a maintenant ), les @synthesizeméthodes d utilisent un verrou au niveau de l'objet pour garantir que plusieurs lectures / écritures sur une seule propriété sont sérialisées. Comme le soulignent les documents Apple, cela ne signifie pas que l'objet entier est thread-safe , mais les lectures / écritures de propriétés individuelles le sont.

Bien sûr, si vous implémentez vos propres accesseurs plutôt que d'utiliser @synthesize, je pense que ces déclarations ne font rien d'autre que d'exprimer votre intention de savoir si la propriété est implémentée de manière threadsafe.


7
J'aime cette réponse - moins déroutante, plus simple et plus complète que celles trouvées ailleurs!
PapillonUK

Vraiment génial et moins déroutant (+1) mais pouvez-vous s'il vous plaît dire que pourquoi non atomique potentiellement beaucoup plus rapide qu'un accesseur atomique?
Souhait

2
@Wish Les accesseurs non atomiques peuvent être plus rapides car pour empêcher d'autres threads de lire / écrire en même temps, vous devez tenir un mutex ou faire d'autres astuces de bas niveau qui coûtent du temps CPU. Si vous utilisez un verrou, vous pouvez également finir par bloquer sur d'autres threads, ce qui prend également du temps.
Jesse Rusak

1
@Rob Vous voudrez peut-être poser une nouvelle question à ce sujet.
Jesse Rusak

1
@Pratik Désolé, ce n'est pas correct. La citation que vous montrez dit exactement la même chose que moi: que créer une propriété atomicévite les plantages lors de l'accès aux propriétés individuelles mais ne garantit pas que l'objet dans son ensemble (c'est-à-dire accéder à des propriétés séparées comme le prénom et le nom) va faire la bonne chose.
Jesse Rusak

46

Après avoir lu autant d'articles et de publications StackOverflow, et après avoir créé des applications de démonstration pour vérifier les attributs de propriété Variable, j'ai décidé de rassembler toutes les informations sur les attributs.

  1. atomique // par défaut
  2. non atomique
  3. strong = conserver // par défaut
  4. faible = unsafe_unretained
  5. conserver
  6. attribuer // par défaut
  7. unsafe_unretained
  8. copie
  9. lecture seulement
  10. readwrite // par défaut

Voici donc le lien détaillé de l'article où vous pouvez trouver tous les attributs mentionnés ci-dessus, qui vous aideront certainement. Un grand merci à toutes les personnes qui donnent les meilleures réponses ici !!

Attributs de propriété variable ou modificateurs dans iOS

  1. atomique
    • Atomic signifie qu'un seul thread accède à la variable (type statique).
    • Atomic est thread-safe.
    • Mais les performances sont lentes.
    • Atomic est le comportement par défaut.
    • Les accesseurs atomiques dans un environnement non récupéré par les déchets (c'est-à-dire lors de l'utilisation de retenir / libérer / autorelease) utiliseront un verrou pour s'assurer qu'un autre thread n'interfère pas avec le réglage / obtention correct de la valeur.
    • ce n'est pas réellement un mot-clé.

Exemple :

@property (retain) NSString *name;

@synthesize name;
  1. non atomique
    • Non atomique signifie que plusieurs threads accèdent à la variable (type dynamique).
    • Nonatomic est thread unsafe.
    • Mais il est rapide en performance.
    • Non atomique n'est PAS un comportement par défaut; nous devons ajouter un mot-clé non atomique dans l'attribut de propriété.
    • cela peut entraîner un comportement inattendu, lorsque deux processus différents (threads) accèdent à la même variable en même temps.

Exemple:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

En plus de ce qui a déjà été dit sur la sécurité des threads, les propriétés non atomiques sont plus rapides que les accesseurs atomiques. Ce n'est pas quelque chose dont vous devez généralement vous inquiéter, mais gardez-le à l'esprit. Les propriétés générées par Core Data sont partiellement non atomiques pour cette raison.


9

Dans un programme multithread, une opération atomique ne peut pas être interrompue partiellement, contrairement aux opérations non atomiques.

Par conséquent, vous devriez utiliser des mutex (ou quelque chose comme ça) si vous avez une opération critique non atomique que vous ne voulez pas interrompre.


8

Si vous spécifiez "atomic", les fonctions d'accès générées ont du code supplémentaire pour se prémunir contre les mises à jour simultanées.


6

Généralement atomique signifie que les écritures / lectures dans la propriété se produisent en une seule opération. Opération_atomique


2

Vous pouvez avoir une idée de ce genre de choses en lisant l'article ci-dessous.

Threading expliqué avec le but du non atomique

nonatomique - Non compatible avec les threads

atomic - Thread Safe - Il s'agit de l'attribut de propriété par défaut.


1
Êtes-vous sûr que ce n'est pas le contraire? Les propriétés atomiques sont sûres mais les propriétés non atomiques ne sont pas sûres. La dernière fois que j'ai vérifié, c'était comme ça: P
David Rönnqvist

0

Le "atomique" signifie que l'accès à la propriété est thread-safe. Tandis que le "nonatomic" est l'opposé. Lorsque vous déclarez une propriété en Objective-C, la propriété est atomique par défaut, de sorte que les accesseurs synthétisés fournissent un accès robuste à la propriété dans un environnement multithread, c'est-à-dire que la valeur renvoyée par le getter ou définie via le setter est toujours entièrement récupérée ou définie indépendamment de ce que les autres threads s'exécutent simultanément. Mais si vous déclarez la propriété comme non atomique comme ci-dessous

@property (nonatomic, retain)  NSString *myString;

alors cela signifie qu'un accesseur synthétisé pour une propriété d'objet renvoie simplement la valeur directement. L'effet de l'attribut non atomique dépend de l'environnement. Par défaut, les accesseurs synthétisés sont atomiques. Donc non atomique est considérablement plus rapide que atomique.


-2

L'un est pour les threads multiples. On n'est pas


IMHO: Afin d'obtenir des votes positifs, vous devez être plus précis et passer du temps à rédiger votre réponse.
Johan Karlsson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.