Es wird allgemein angenommen, dass die Verwendung von „const“ in C 11 Thread garantiert Sicherheit. Dieser Begriff bedarf jedoch weiterer Klärung.
Während „const“ allein keine Thread-Sicherheit garantiert, erfüllt es die Erwartung der Standardbibliothek, dass Operationen an „const“-Objekten Thread-sicher sind. sicher. Konkret:
Im Gegensatz zu Javas „synchronized“ ist dies bei „const“ der Fall nicht von Natur aus eine Synchronisierung bieten. Betrachten Sie das folgende Beispiel:
class rect { int width = 0, height = 0; public: void set_size(int new_width, int new_height) { width = new_width; height = new_height; } int area() const { return width * height; } };
Um „const“ ordnungsgemäß für die Thread-Sicherheit bei Schreibvorgängen zu nutzen, muss der veränderliche Zustand (wie ein zwischengespeicherter Bereichswert) durch Synchronisierungsprimitive geschützt werden, wie unten gezeigt:
class rect { int width = 0, height = 0; mutable std::mutex cache_mutex; mutable int cached_area = 0; mutable bool cached_area_valid = true; public: void set_size(int new_width, int new_height) { if (new_width != width || new_height != height) { std::lock_guard< std::mutex > guard(cache_mutex); cached_area_valid = false; } width = new_width; height = new_height; } int area() const { std::lock_guard< std::mutex > guard(cache_mutex); if (!cached_area_valid) { cached_area = width * height; cached_area_valid = true; } return cached_area; } };
Obwohl „area()“ threadsicher ist, bleibt „rect“ aufgrund ungeschützter Schreibvorgänge immer noch nicht threadsicher 'set_size()'.
Die Behauptung, dass C-Entwicklern die Schlüsselwörter ausgehen, ist wahr, da die Sprache seit ihrer Einführung nur eine begrenzte Anzahl reservierter Wörter hatte.
Das obige ist der detaillierte Inhalt vonGarantiert „const' in C 11 Thread-Sicherheit?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!