71 votes

Pourquoi le qualificatif volatile est-il utilisé dans tout std::atomic ?

D'après ce que j'ai lu de Herb Sutter y autres on pourrait penser que volatile et la programmation concurrente étaient des concepts complètement orthogonaux, du moins en ce qui concerne le C/C++.

Cependant, dans les pays du CCG mise en œuvre tous les std::atomic Les fonctions membres de l'association ont l'attribut volatile qualificatif. Il en va de même dans l'ouvrage d'Anthony Williams mise en œuvre de std::atomic .

Alors quel est le deal, faire mon atomic<> les variables doivent être volatile ou pas ?

77voto

Herb Sutter Points 1511

Pour résumer ce que d'autres ont correctement écrit :

C/C++ volatile est pour l'accès matériel et les interruptions. C++11 atomic<> est destiné à la communication inter-filière (par exemple, dans un code sans verrou). Ces deux concepts/utilisations sont orthogonaux, mais leurs exigences se chevauchent et c'est pourquoi les gens les ont souvent confondus.

La raison pour laquelle atomic<> a des fonctions qualifiées de volatiles est la même raison qu'il a des fonctions qualifiées de const, parce qu'il est possible en principe pour un objet d'être à la fois atomic<> et aussi const et/ou volatile .

Bien sûr, comme le souligne mon article, une autre source de confusion est que C/C++ volatile n'est pas la même chose que C#/Java volatile (ce dernier est fondamentalement équivalent à C++11 atomic<> ).

56voto

stephan Points 6006

Pourquoi le volatile qualificatif utilisé tout au long de std::atomic ?

Pour que les objets volatils puissent aussi être atomiques. Voir aquí :

La citation pertinente est la suivante

Les fonctions et opérations sont définies pour fonctionner avec des objets volatils, de sorte que les variables qui devraient être volatiles peuvent également être atomiques. Le qualificatif volatile n'est cependant pas nécessaire pour l'atomicité.

Est-ce que mon atomic<> les variables doivent être volatile ou pas ?

Non, les objets atomiques n'ont pas besoin d'être volatiles.

15voto

Comme const, volatile est transitif. Si vous déclarez une méthode comme volatile alors vous ne pouvez pas appeler de méthode non volatile sur lui ou sur l'un de ses attributs membres. En ayant std::atomic méthodes volatile vous autorisez les appels provenant de volatile les méthodes membres des classes qui contiennent le std::atomic variables.

Je ne passe pas une bonne journée... tellement confuse... peut-être qu'un petit exemple peut aider :

struct element {
   void op1() volatile;
   void op2();
};
struct container {
   void foo() volatile {
      e.op1();  // correct
      //e.op2();  // compile time error
   }
   element e;
};

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