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?
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?
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<>
).
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
.
struct element {
void op1() volatile;
void op2();
};
struct container {
void foo() volatile {
e.op1(); // correct
//e.op2(); // compile time error
}
element e;
};
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