C++ named requirements: Mutex (since C++11)
From cppreference.net
Die Mutex -Anforderungen erweitern die Lockable -Anforderungen um die Synchronisation zwischen Threads.
Inhaltsverzeichnis |
Anforderungen
- Lockable
- DefaultConstructible
- Destructible
- nicht kopierbar
- nicht verschiebbar
Für ein Objekt
m
vom Typ
Mutex
:
- Der Ausdruck m. lock ( ) besitzt die folgenden Eigenschaften
-
- Verhält sich wie ein atomarer Vorgang.
- Blockiert den aufrufenden Thread, bis exklusiver Besitz des Mutex erlangt werden kann.
- Vorherige m. unlock ( ) -Operationen auf demselben Mutex synchronisieren mit dieser Sperroperation (entspricht Release-Acquire std::memory_order ).
- Das Verhalten ist undefiniert, wenn der aufrufende Thread bereits den Mutex besitzt (außer wenn m ein std::recursive_mutex oder std::recursive_timed_mutex ist).
- Ausnahmen vom Typ std::system_error können bei Fehlern geworfen werden, mit folgenden Fehlercodes:
-
- std::errc::operation_not_permitted wenn der aufrufende Thread nicht über die erforderlichen Berechtigungen verfügt.
- std::errc::resource_deadlock_would_occur wenn die Implementierung erkennt, dass dieser Vorgang zu einem Deadlock führen würde.
- Der Ausdruck m. try_lock ( ) besitzt die folgenden Eigenschaften
-
- Verhält sich wie ein atomarer Vorgang.
- Versucht, exklusiven Besitz des Mutex für den aufrufenden Thread zu erlangen, ohne zu blockieren. Wenn der Besitz nicht erlangt wird, kehrt die Funktion sofort zurück. Der Funktion ist es erlaubt, sporadisch zu scheitern und zurückzukehren, selbst wenn der Mutex derzeit nicht von einem anderen Thread besessen wird.
-
Wenn
try_lock()erfolgreich ist, synchronisieren vorherigeunlock()-Operationen auf demselben Objekt mit dieser Operation (entspricht Release-Acquire std::memory_order ).lock()synchronisiert nicht mit einem fehlgeschlagenentry_lock(). - Wirft keine Ausnahmen.
- Der Ausdruck m. unlock ( ) besitzt die folgenden Eigenschaften
-
- Verhält sich wie ein atomarer Vorgang.
- Gibt den Besitz des Mutex durch den aufrufenden Thread frei und synchronizes-with den nachfolgenden erfolgreichen Sperrvorgängen am selben Objekt.
- Das Verhalten ist undefiniert, wenn der aufrufende Thread den Mutex nicht besitzt.
- Wirft keine Ausnahmen.
- Alle Sperr- und Freigabeoperationen an einem einzelnen Mutex erfolgen in einer einzigen Gesamtordnung, die als Änderungsreihenfolge einer atomaren Variable betrachtet werden kann: Die Reihenfolge ist spezifisch für diesen einzelnen Mutex.
Standardbibliothek
Die folgenden Standardbibliothekstypen erfüllen Mutex -Anforderungen:
|
(C++11)
|
bietet grundlegende gegenseitige Ausschlussfunktionalität
(Klasse) |
|
(C++11)
|
bietet gegenseitige Ausschlussfunktionalität, die rekursiv durch denselben Thread gesperrt werden kann
(Klasse) |
|
(C++11)
|
bietet gegenseitige Ausschlussfunktionalität, die rekursiv
durch denselben Thread gesperrt werden kann und implementiert Timeout-Sperrung (Klasse) |
|
(C++17)
|
bietet gemeinsame gegenseitige Ausschlussfunktionalität
(Klasse) |
|
(C++14)
|
bietet gemeinsame gegenseitige Ausschlussfunktionalität und implementiert Timeout-Sperrung
(Klasse) |
|
(C++11)
|
bietet gegenseitige Ausschlussfunktionalität, die Timeout-Sperrung implementiert
(Klasse) |
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 2309 | C++11 |
lock
könnte
std::system_error
mit Fehlercode std::errc::device_or_resource_busy werfen |
nicht erlaubt |