Zastanawiam się, czy tylko podstawowe typy danych mogą być std :: atomowe w C++ 11? Czy można na przykład zadeklarować, że obiekt klasy bibliotecznej zostanie "atomowo" zmutowany lub uzyskany dostęp?C++ 11 Czy tylko pierwotne typy danych mogą być zadeklarowane jako atomowe?
Na przykład może mam
using namespace std::chrono;
time_point<high_resolution_clock> foo;
// setter method
void set_foo() {
foo = high_resolution_clock::now();
}
// getter method
time_point<high_resolution_clock> get_foo() {
return foo;
}
Ale jeśli te metody setter i getter są nazywane w różnych wątkach, myślę, że może spowodować niezdefiniowane zachowanie. Byłoby miło, gdybym mógł zadeklarować foo coś takiego:
std::atomic<time_point<high_resolution_clock>> foo;
... tak, że wszystkie operacje na foo będzie prowadzona w sposób atomowej. W zgłoszeniu do mojego projektu jest prawdopodobnie setki takich zmiennych foo zadeklarowanych na kilkudziesięciu klasach i wydaje mi się, że byłoby znacznie wygodniej dokonać mutacji obiektu i dostępu do "atomowej", że tak powiem, zamiast deklarować i lock_guard muteksuje w każdym miejscu.
Czy to nie jest możliwe, czy jest lepsze podejście, czy też naprawdę muszę używać muteksu i lock_guarda wszędzie?
Aktualizacja:
- Wszelkie chętnych? Szukałem przyzwoitej informacji w Internecie, ale jest tak mało przykładów użycia atomu, że nie jestem pewien, w jakim stopniu można go zastosować.
std :: atomic nie zastępuje złamanego kodu wątku. Jeśli inny wątek wywoła program ustawiający, to niezależnie od tego, co pierwszy wątek go wywoła, i tak otrzyma wartość śmieci od gettera. –