Dlaczego kwalifikator Lotny jest używany przez out std:: atomic?

Z tego, co czytałem z Herb Sutter i innych można by pomyśleć, że volatile i programowanie współbieżne były całkowicie ortogonalnymi pojęciami, przynajmniej jeśli chodzi o C/C++.

Jednak w implementacji GCC wszystkie funkcje Członkowskie std::atomic posiadają kwalifikator volatile. Podobnie jest w implementacji Anthony ' ego Williamsa z std::atomic.

Więc o co chodzi, czy moje atomic<> zmienne muszą być volatile czy nie?

Author: Ville-Valtteri, 2010-03-19

3 answers

Dlaczego kwalifikator volatile jest używany w std::atomic?

Tak, że lotne obiekty mogą być również atomowe. Zobacz tutaj :

Odpowiedni cytat to

Funkcje i operacje są zdefiniowane do pracy z obiektami lotnymi, więc zmienne, które powinny być lotne, mogą być również atomowe. Kwalifikator Lotny nie jest jednak wymagany dla atomiczności.

Czy moje zmienne atomic<> muszą być volatile lub nie?

Nie, obiekty atomowe nie muszą być lotne.
 56
Author: stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 07:46:46

Aby podsumować to, co inni poprawnie napisali:

C / C++ volatile jest dla dostępu sprzętowego i przerwań. C++11 atomic<> służy do komunikacji między wątkami (np. w kodzie bez blokady). Te dwa pojęcia/zastosowania są ortogonalne, ale mają nakładające się wymagania i dlatego ludzie często mylą te dwa.

Powód, dla którego atomic<> ma funkcje kwalifikowane, jest tym samym powodem, dla którego ma funkcje kwalifikowane, ponieważ jest możliwe w zasadzie dla obiektu be zarówno atomic<>, jak i const i / lub volatile.

Oczywiście, jak zauważył mój artykuł, kolejnym źródłem nieporozumień jest to,że C/C++ volatile nie jest tym samym co C# / Java volatile (ta ostatnia jest zasadniczo równoważna C++11 atomic<>).

 77
Author: Herb Sutter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-05 13:15:37

Jako const, lotność jest przemijająca. Jeśli zadeklarujesz metodę jako volatile, nie możesz wywołać na niej żadnej nieulotnej metody ani żadnego z jej atrybutów członkowskich. Posiadając metody std::atomic volatile zezwalasz na wywołania z metod członkowskich volatile w klasach zawierających zmienne std::atomic.

Nie mam dobrego dnia... to takie zagmatwane... może mały przykład pomoże:
struct element {
   void op1() volatile;
   void op2();
};
struct container {
   void foo() volatile {
      e.op1();  // correct
      //e.op2();  // compile time error
   }
   element e;
};
 15
Author: David Rodríguez - dribeas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-19 17:25:36