Heim >Backend-Entwicklung >C++ >Garantiert „const' in C 11 Thread-Sicherheit?

Garantiert „const' in C 11 Thread-Sicherheit?

DDD
DDDOriginal
2024-12-20 20:59:10865Durchsuche

Does `const` in C  11 Guarantee Thread Safety?

Bedeutet „const“ Thread-Sicherheit in C 11?

Einführung

Es wird allgemein angenommen, dass die Verwendung von „const“ in C 11 Thread garantiert Sicherheit. Dieser Begriff bedarf jedoch weiterer Klärung.

Klärung des Anspruchs

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:

  • Vorgänge, die mit „const“ gekennzeichnet sind, sollten vollständig aus Lesevorgängen (keine Schreibvorgänge) oder intern synchronisierten Schreibvorgängen bestehen.
  • Die Standardbibliothek geht davon aus, dass alle Vorgänge an „const“-Objekten in sich selbst ausgeführt werden nicht rennend sein (solange seine Nicht-Konstanten-Argumente Parallelität verarbeiten).
  • Wenn die Operationen eines Typs an seinen „Konstanten“-Objekten einen Verstoß darstellen Unter Berücksichtigung dieser Erwartung könnte die Verwendung dieses Typs mit der Standardbibliothek zu Datenwettläufen und undefiniertem Verhalten führen.

Const entspricht nicht Javas Synchronized

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;
    }
};
  • Die Funktion „area()“ ist threadsicher, da sie nur liest, nicht schreibt.
  • „rect“ selbst ist dies jedoch nicht Thread-sicher, da die von 'set_size()' durchgeführten Schreibvorgänge nicht synchronisiert werden.

Bedingte Thread-Sicherheit mit 'const'

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()'.

Schlüsselwortmangel

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn