Namensräume
Varianten
Aktionen

std::shared_timed_mutex

Von cppreference.com
< cpp‎ | thread
 
 
Bibliothek für nebenläufige Programmierung
Threads
(C++11)
(C++20)
this_thread Namespace
(C++11)
(C++11)
(C++11)
Kooperatives Beenden
Gegenseitiger Ausschluss
(C++11)
shared_timed_mutex
(C++14)
Allgemeines Sperrungsmanagement
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Bedingungsvariablen
(C++11)
Semaphoren
Latches und Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
(C++11)
Sichere Wiederherstellung
(C++26)
Hazard Pointer
Atomare Typen
(C++11)
(C++20)
Initialisierung von atomaren Typen
(C++11)(veraltet in C++20)
(C++11)(veraltet in C++20)
Speicherordnung
(C++11)(deprecated in C++26)
Freie Funktionen für atomare Operationen
Freie Funktionen für atomare Flags
 
 
Definiert in Header <shared_mutex>
class shared_timed_mutex;
(seit C++14)

Die Klasse shared_timed_mutex ist eine Synchronisationsprimitivität, die verwendet werden kann, um gemeinsam genutzte Daten vor gleichzeitigem Zugriff durch mehrere Threads zu schützen. Im Gegensatz zu anderen Mutex-Typen, die exklusiven Zugriff ermöglichen, hat ein shared_timed_mutex zwei Zugriffsebenen:

  • exklusiv - nur ein Thread kann den Mutex besitzen.
  • gemeinsam - mehrere Threads können den Besitz desselben Mutex teilen.

Gemeinsame Mutexes werden normalerweise in Situationen verwendet, in denen mehrere Leser gleichzeitig auf dieselbe Ressource zugreifen können, ohne Datenrennen zu verursachen, aber nur ein Schreiber dies tun kann.

Ähnlich wie bei timed_mutex bietet shared_timed_mutex die Möglichkeit, zu versuchen, den Besitz eines shared_timed_mutex mit einem Timeout über die Memberfunktionen try_lock_for(), try_lock_until(), try_lock_shared_for(), try_lock_shared_until() zu beanspruchen.

Die Klasse shared_timed_mutex erfüllt alle Anforderungen von SharedTimedMutex und StandardLayoutType.

Inhalt

[edit] Memberfunktionen

konstruiert den Mutex
(public member function) [edit]
zerstört den Mutex
(public member function) [edit]
operator=
[gelöscht]
nicht kopierbar
(public member function) [edit]
Exklusives Sperren
sperrt den Mutex, blockiert, wenn der Mutex nicht verfügbar ist
(public member function) [edit]
versucht, den Mutex zu sperren, kehrt zurück, wenn der Mutex nicht verfügbar ist
(public member function) [edit]
versucht, den Mutex zu sperren, kehrt zurück, wenn der Mutex
für die angegebene Zeitdauer nicht verfügbar war
(public member function) [edit]
versucht, den Mutex zu sperren, kehrt zurück, wenn der Mutex
bis zum Erreichen des angegebenen Zeitpunktpunkts nicht verfügbar
(public member function) [edit]
entsperrt den Mutex
(public member function) [edit]
Gemeinsames Sperren
sperrt den Mutex für gemeinsamen Besitz, blockiert, wenn der Mutex nicht verfügbar ist
(public member function) [edit]
versucht, den Mutex für gemeinsamen Besitz zu sperren, kehrt zurück, wenn der Mutex nicht verfügbar ist
(public member function) [edit]
versucht, den Mutex für gemeinsamen Besitz zu sperren, kehrt zurück, wenn der Mutex
für die angegebene Zeitdauer nicht verfügbar war
(public member function) [edit]
versucht, den Mutex für gemeinsamen Besitz zu sperren, kehrt zurück, wenn der Mutex
bis zum Erreichen des angegebenen Zeitpunktpunkts nicht verfügbar
(public member function) [edit]
entsperrt den Mutex (gemeinsamer Besitz)
(public member function) [edit]

[edit] Anmerkungen

Feature-Test-Makro Wert Std Feature
__cpp_lib_shared_timed_mutex 201402L (C++14) std::shared_timed_mutex

[edit] Beispiel

Ein Copy-Assignment-Operator für eine Klasse, die Ressourcen enthält, die mehrere Leser, aber nur einen Schreiber verarbeiten können.

#include <mutex>
#include <shared_mutex>
 
class R
{
    mutable std::shared_timed_mutex mut;
    /* data */
public:
    R& operator=(const R& other)
    {
        // requires exclusive ownership to write to *this
        std::unique_lock<std::shared_timed_mutex> lhs(mut, std::defer_lock);
        // requires shared ownership to read from other
        std::shared_lock<std::shared_timed_mutex> rhs(other.mut, std::defer_lock);
        std::lock(lhs, rhs);
        /* assign data */
        return *this;
    }
};
 
int main()
{
    R r;
}