web-dev-qa-db-fra.com

Définition de "objet atomique"

Dans le jargon standard de C et C++, l'expression " objet atomique " signifie " objet of atomic tapez, "n'est-ce pas?

Aucune norme ne définira explicitement chaque phrase de deux mots, donc on ne reproche pas aux normes C et C++ d'omettre la définition explicite de celle-ci. Néanmoins, quand j'ai lu dans la norme C++ 17 (brouillon ici ), sect. 4.7.1 (4), que "toutes les modifications d'un objet atomique particulier [~ # ~] m [~ # ~] se produisent dans un ordre total particulier, appelé la modification of [~ # ~] m [~ # ~] "- et lorsque la norme utilise à plusieurs reprises un langage similaire pour délimiter une logique de plus en plus précise pour la concurrence - je voudrais soyez sûr que je ne me méprends pas par inadvertance.

Dois-je supposer correctement que l'expression "objet atomique" signifie

  • objet de type atomique?

La seule alternative plausible que je peux imaginer serait que la phrase signifiait plutôt

  • correctement aligné objet suffisamment petit pour que le matériel puisse le gérer atomiquement.

C'est quoi, s'il vous plait?

(Remarque: je marque cette question à la fois en C et en C++ car, en ce qui concerne l'atomique, les deux normes utilisent un langage presque identique. Pour cette raison, un expert dans l'une ou l'autre langue peut répondre à ma connaissance. Si pour une raison quelconque je suis erreur, veuillez supprimer la balise C et conserver le C++.)

Référence: voir aussi cette question, pour laquelle ma question est préliminaire.

22
thb

La norme C++ impose un ensemble de règles sur les opérations et les effets des opérations sur les objets atomiques ( [intro.races] ). Si toutes les opérations sur un objet satisfont à ces règles, alors cet objet est atomique.

l'expression "objet atomique" signifie "objet de type atomique", n'est-ce pas?

Il n'est pas formulé ainsi dans la norme. Mais puisque l'effet des opérations est déterminé par le type de l'objet, ce n'est pas une conclusion déraisonnable. De même, le type atomique est un type dont les instances sont des objets atomiques.

La bibliothèque standard C++ fournit un ensemble de types qui sont garantis atomiques, ainsi que des fonctions pour ces types qui sont garantis comme étant des opérations atomiques ( [atomics] ).

objet correctement aligné suffisamment petit pour que le matériel puisse le manipuler de manière atomique.

La norme C++ ne spécifie rien sur l'alignement ou la taille des objets atomiques.

Si un objet/type est garanti atomique (voir [atomics] ), et si le matériel a de telles exigences pour l'atomicité, alors l'implémentation du langage doit garantir que ces exigences sont remplies, ou l'implémentation doit utiliser des verrous pour renforcer l'atomicité.

7
eerorika

À mon avis, l'atomicité - à proprement parler - ne s'applique pas aux types ou aux objets, elle s'applique à opérations, c'est-à-dire que vous pouvez dire qu'une opération est atomique ou non.

Par "objet atomique", nous entendons un objet dont l'interface publique expose uniquement les opérations atomiques, c'est-à-dire que toutes les opérations que vous pouvez effectuer avec cet objet sont atomiques.

En C et C++, il se peut que les concepts soient définis dans l'autre sens: définissez d'abord les objets atomiques puis définissez les opérations atomiques en termes d'objets atomiques. Il était probablement logique que le C et le C++ le définissent de cette façon car le libellé de la norme vise principalement à définir le langage. Cependant, du point de vue de la fonctionnalité théorique et abstraite, les opérations atomiques sont la principale préoccupation.

Le C++ a la norme std::atomic<T> modèle de classe qui correspond aux descriptions ci-dessus.

18
bolov

Je peux répondre pour C, mais C++ est en effet destiné à être synchronisé avec C sur ces points.

Oui, lorsque la norme C parle d '"objet atomique", cela signifie un objet avec un type efficace qualifié atomique. Mais il semble également que cela ne soit pas écrit de manière explicite, donc ce serait probablement une bonne idée d'ajouter cela. Je verrai ça.

De plus, à part certaines personnes, il n'y a pas d'opérations atomiques en C sans objets atomiques. Ceci est volontairement fixé comme ça, de sorte que l'atomicité de l'accès à ces objets ne peut jamais être compromise.

4
Jens Gustedt