Namespaces
Variants

std:: recursive_mutex

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
(C++11)
recursive_mutex
(C++11)
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Definiert im Header <mutex>
class recursive_mutex ;
(seit C++11)

Die recursive_mutex -Klasse ist ein Synchronisierungsprimitive, das verwendet werden kann, um gemeinsame Daten vor gleichzeitigem Zugriff durch mehrere Threads zu schützen.

recursive_mutex bietet exklusive, rekursive Besitzsemantik:

  • Ein aufrufender Thread besitzt ein recursive_mutex für einen Zeitraum, der beginnt, wenn er erfolgreich entweder lock oder try_lock aufruft. Während dieses Zeitraums darf der Thread zusätzliche Aufrufe von lock oder try_lock durchführen. Der Besitzzeitraum endet, wenn der Thread eine entsprechende Anzahl von Aufrufen von unlock durchführt.
  • Wenn ein Thread ein recursive_mutex besitzt, werden alle anderen Threads blockiert (bei Aufrufen von lock ) oder erhalten einen false Rückgabewert (für try_lock ), wenn sie versuchen, das Eigentum am recursive_mutex zu beanspruchen.
  • Die maximale Anzahl, wie oft ein recursive_mutex gesperrt werden darf, ist nicht spezifiziert, aber nach Erreichen dieser Anzahl werden Aufrufe von lock eine std::system_error Ausnahme werfen und Aufrufe von try_lock den Wert false zurückgeben.

Das Verhalten eines Programms ist undefiniert, wenn ein recursive_mutex zerstört wird, während er noch von einem Thread besessen wird. Die recursive_mutex -Klasse erfüllt alle Anforderungen von Mutex und StandardLayoutType .

Inhaltsverzeichnis

Mitgliedertypen

Mitgliedtyp Definition
native_handle_type ( optional* ) implementierungsdefiniert

Memberfunktionen

Konstruiert den Mutex
(öffentliche Elementfunktion)
Zerstört den Mutex
(öffentliche Elementfunktion)
operator=
[deleted]
Nicht kopierzuweisbar
(öffentliche Elementfunktion)
Sperren
Sperrt den Mutex, blockiert falls der Mutex nicht verfügbar ist
(öffentliche Elementfunktion)
Versucht den Mutex zu sperren, kehrt zurück falls der Mutex nicht verfügbar ist
(öffentliche Elementfunktion)
Entsperrt den Mutex
(öffentliche Elementfunktion)
Native Handle
Gibt das zugrundeliegende implementierungsdefinierte Native-Handle-Objekt zurück
(öffentliche Elementfunktion)

Beispiel

Ein Anwendungsfall für recursive_mutex ist der Schutz gemeinsamer Zustände in einer Klasse, deren Memberfunktionen sich gegenseitig aufrufen können.

#include <iostream>
#include <mutex>
#include <thread>
class X
{
    std::recursive_mutex m;
    std::string shared;
public:
    void fun1()
    {
        std::lock_guard<std::recursive_mutex> lk(m);
        shared = "fun1";
        std::cout << "in fun1, shared variable is now " << shared << '\n';
    }
    void fun2()
    {
        std::lock_guard<std::recursive_mutex> lk(m);
        shared = "fun2";
        std::cout << "in fun2, shared variable is now " << shared << '\n';
        fun1(); // recursive lock becomes useful here
        std::cout << "back in fun2, shared variable is " << shared << '\n';
    }
};
int main() 
{
    X x;
    std::thread t1(&X::fun1, &x);
    std::thread t2(&X::fun2, &x);
    t1.join();
    t2.join();
}

Mögliche Ausgabe:

in fun1, shared variable is now fun1
in fun2, shared variable is now fun2
in fun1, shared variable is now fun1
back in fun2, shared variable is fun1

Siehe auch

(C++11)
bietet grundlegende gegenseitige Ausschlussfunktionalität
(Klasse)