Quelles opérations sont atomiques en C #?

Existe-t-il un moyen systématique de savoir si une opération en C # sera atomique ou non? Ou existe-t-il des directives générales ou des règles générales?

Pour quelque chose de plus complet / détaillé:

Les lectures et écritures sur des types de valeur 32 bits sont atomiques: cela inclut les types de valeur insortingnsèque suivants: bool, char, byte, sbyte, short, ushort, int, uint, float . Les types suivants (parmi d’autres) ne sont pas garantis atomiques: decimal, double, long, ulong .

par exemple

 int x; x = 10; // atomic decimal d; d = 10m; // not atomic 

L’atsortingbution de référence est également une opération atomique:

 private Ssortingng _text; public void Method(Ssortingng text) { _text = text; // atomic } 

Oui. Lisez la spécification de la CLI: http://www.ecma-international.org/publications/standards/Ecma-335.htm . Par exemple:

I.12.6.6 Atomic lit et écrit

Une interface de ligne de commande conforme garantira que l’access en lecture et en écriture à des emplacements de mémoire correctement alignés ne soit pas supérieur à la taille du mot natif (la taille du type nat int) est atomique (voir §I.12.6.2). la même taille. Les écritures atomiques ne modifieront aucun autre bit que ceux écrits. Sauf si un contrôle de mise en page explicite (voir Partition II (Contrôle de l’instance)) est utilisé pour modifier le comportement par défaut, les éléments de données dont la taille ne dépasse pas la taille naturelle du mot (taille d’un int natif) doivent être correctement alignés. Les références d’object doivent être traitées comme si elles étaient stockées dans la taille de mot native.

[Note: Il n’y a aucune garantie sur la mise à jour atomique (lecture-modification-écriture) de la mémoire, sauf pour les méthodes fournies à cette fin dans le cadre de la bibliothèque de classes (voir Partition IV). Une écriture atomique d’un «petit élément de données» (un élément ne dépassant pas la taille du mot natif) est nécessaire pour effectuer une lecture / modification / écriture atomique sur un matériel ne prenant pas en charge les écritures directes sur de petits éléments de données. note finale]

[Remarque: Il n’existe pas d’access atomique garanti aux données à 8 octets lorsque la taille d’un int natif est de 32 bits, même si certaines implémentations peuvent effectuer des opérations atomiques lorsque les données sont alignées sur une limite de 8 octets. note finale]

En ce qui concerne la question longue de 64 bits, Eric Lippert y répond ici: http://blogs.msdn.com/b/ericlippert/archive/2011/05/31/atomicity-volatility-and-immutability-are-different-part- deux.aspx

La spécification de l’interface de ligne de commande offre de meilleures garanties. L’interface de ligne de commande garantit que les lectures et écritures de variables de types valeur qui sont de la taille (ou inférieure) de la taille du pointeur naturel du processeur sont atomiques; Si vous exécutez du code C # sur un système d’exploitation 64 bits dans une version 64 bits du CLR, les lectures et écritures de doubles 64 bits et les entiers longs sont également garantis. Le langage C # ne le garantit pas, mais les spécifications d’exécution le font. (Si vous exécutez du code C # dans un environnement qui n’est pas implémenté par une implémentation de la CLI, vous ne pouvez évidemment pas compter sur cette garantie; contactez le fournisseur qui vous a vendu le runtime pour savoir quelles garanties ils offrent.)

Un autre point subtil à propos de l’access atomique est que le processeur sous-jacent ne garantit l’atomicité que lorsque la variable en cours de lecture ou d’écriture est associée à un stockage aligné sur le bon emplacement en mémoire. Finalement, la variable sera implémentée comme un pointeur vers la mémoire quelque part. Sur un système d’exploitation 32 bits, ce pointeur doit être divisible par 4 pour que la lecture ou l’écriture soit garantie, et sur un système d’exploitation 64 bits, il doit être divisible par 8.

À partir des spécifications CLI, vous pouvez obtenir ici :

“Une interface de ligne de commande conforme garantira que l’access en lecture et en écriture à des emplacements de mémoire correctement alignés ne soit pas supérieur à la taille de mot native (la taille du type nat int) est atomique…”

Section 12.5 de la spécification C # ici :

«Les lectures et écritures des types de données suivants doivent être atomiques: types bool, char, byte, sbyte, short, ushort, uint, int, float et référence.» Aussi: «… il n’y a aucune garantie de lecture-modification atomique écrire, comme dans le cas de l’incrémentation ou de la décrémentation.

Faites l’opération d’incrément atomique avec ceci .