Ich frage mich, können nur primitive Datentypen std :: atomic in C++ 11 deklariert werden? Ist es beispielsweise möglich, ein Bibliotheksklassenobjekt als "atomisch" mutiert zu erklären oder darauf zuzugreifen?C++ 11 Können nur primitive Datentypen als atomar deklariert werden?
Zum Beispiel, ich habe vielleicht
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;
}
Aber, wenn diese Setter und Getter-Methoden in verschiedenen Threads aufgerufen werden, denke ich, dass nicht definiertes Verhalten verursachen kann. Es wäre schön, wenn ich wie foo etwas erklären kann:
std::atomic<time_point<high_resolution_clock>> foo;
... so dass alle Operationen auf foo in einer atomaren Weise durchgeführt werden würden. In der Anwendung für mein Projekt gibt es möglicherweise Hunderte von solchen foo Variablen über Dutzende von Klassen deklariert, und ich denke, es wäre viel bequemer, das Objekt mutieren und sozusagen "atomare", anstatt zu deklarieren und lock_guard Mutexes überall.
Ist das nicht möglich, oder gibt es einen besseren Ansatz, oder muss ich wirklich einen Mutex und lock_guard überall verwenden?
aktualisieren:
- Jeder Abnehmer? Ich habe im Internet nach anständigen Informationen geforscht, aber es gibt so wenige Beispiele für atomare Anwendungen, von denen ich nicht sicher sein kann, in welchem Umfang sie angewendet werden können.
Std :: Atomic ist keine Problemumgehung für defekten Thread-Code. Wenn ein anderer Thread den Setter aufruft, wird der erste Thread, der ihn aufgerufen hat, sowieso einen Garbage-Wert vom Getter erhalten. –