-1
votes

Quand et pourquoi utiliser le package atomique d'aller se compare à =, +

comme le document d'Allez illuminate:

L'opération d'ajout, mise en œuvre par les fonctions ADDT, est l'équivalent atomique de:

* addr + = delta

retour * addr

Les opérations de charge et de stockage, implémentées par les fonctions LoadT et Storet, sont les équivalents atomiques de "retour * addr" et "* addr = val".

Voici ma question:

Pourquoi devrais-je utiliser 'atomic.addt' au lieu de "+"?

pourquoi 'atomic.loadt' pas '='?

n'est pas '=' et '+' AOMIC?

Quelqu'un peut-il me donner un exemple qui montre des différences entre eux?

go

0 commentaires

3 Réponses :


1
votes

Imaginez, il y a 5 gorouts accédant à la même mémoire / source initialisée à 0 en même temps et en essayant de l'incrémenter. Une opération régulière d'incrément "+" conduirait une course de données car il n'y a aucune garantie de l'état mis à jour correctement en raison des opérations simultanées. En fin de compte, rien ne garantit que la valeur de la variable partagée est de 5

Les opérations atomiques aide dans ce cas lorsqu'elles verrouillent la mémoire pour des opérations sécurisées par goroutines et, partant, aucune raccourci de données n'est observée

Vous pouvez également utiliser des canaux ou des mutiles pour verrouiller l'état et utiliser en toute sécurité, ce qui est plus recommandé


0 commentaires

-1
votes

Vous ne devez tout simplement pas utiliser l'emballage atomique à tout .

Comme la documentation de l'emballage indique clairement

Package Atomic fournit des primitives de mémoire atomique de bas niveau utiles pour Mise en œuvre d'algorithmes de synchronisation.

Ces fonctions nécessitent un grand soin d'être utilisé correctement. Sauf pour spécial, Applications de bas niveau, la synchronisation est meilleure avec les canaux ou le installations du package de synchronisation. Partager la mémoire en communiquant; ne pas communiquer en partageant la mémoire.

Il est destiné aux experts seulement.

Vous avez demandé: "N'est pas '=' et '+' Aomic?" Non! Rien (!) En allez est atomique, à l'exception des primitives de l'emballage atomique (d'où le nom), de la synchronisation de package fournit et des opérations de canal.

Donc non, vous ne pouvez pas utiliser = , + , - , / , etc., fonctionnant simultanément. Et vous êtes littéralement jamais devrait écrire du code qui suppose que quelque chose à atomique est correct. Fournissez toujours une synchronisation correcte (via la synchronisation du package) ou via des canaux.


0 commentaires

2
votes

Tout d'abord, vous devez savoir sur le modèle de mémoire Go:

https://golang.org/ref/mem

Le point crucial pour comprendre est que les effets des écritures variables dans une goroutine ne sont pas nécessairement visibles pour une autre goroutine de la même manière que le goroutin d'écriture les obtient. C'est-à-dire que si un goroutine écrit une valeur à une variable A , puis à une autre variable B , une autre goroutine peut voir ces écrires dans un ordre non spécifié. C'est pourquoi vous avez besoin de primitives simultanées comme des canaux ou des mutiles. Tout ce qui s'est passé avant qu'une opération de canal ou une opération mutex ne soit visible à toutes les goroutines à ce moment-là.

Les opérations atomiques offrent des garanties similaires, bien que le modèle de mémoire ne précise pas explicitement cela.

Il n'est pas facile d'écrire du code à l'aide d'atomes. Vous devez envisager toutes les entrelières d'exécution possibles pour vous assurer qu'il n'y a pas de courses. Stick avec des canaux et des mutiles. Le code correct est meilleur que le code rapide mais de la Racy.


0 commentaires