Namensräume
Varianten
Aktionen

std::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
mutex
(C++11)
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 <mutex>
class mutex;
(seit C++11)

Die Klasse mutex ist ein Synchronisationsprimitiv, das verwendet werden kann, um gemeinsam genutzte Daten vor dem gleichzeitigen Zugriff durch mehrere Threads zu schützen.

mutex bietet exklusive, nicht-rekursive Eigentumssemantik.

  • Ein aufrufender Thread besitzt ein mutex ab dem Zeitpunkt, an dem er erfolgreich entweder lock oder try_lock aufruft, bis er unlock aufruft.
  • Wenn ein Thread ein mutex besitzt, werden alle anderen Threads blockiert (bei Aufrufen von lock) oder erhalten einen Rückgabewert von false (für try_lock), wenn sie versuchen, das Eigentum an dem mutex zu beanspruchen.
  • Ein aufrufender Thread darf das mutex nicht bereits besitzen, bevor er lock oder try_lock aufruft.

Das Verhalten eines Programms ist undefiniert, wenn ein mutex zerstört wird, während es noch von Threads besessen wird, oder wenn ein Thread beendet wird, während er ein mutex besitzt. Die Klasse mutex erfüllt alle Anforderungen von Mutex und StandardLayoutType.

std::mutex ist weder kopierbar noch verschiebbar.

Inhalt

[bearbeiten] Verschachtelte Typen

Name Definition
native_handle_type (optional*) implementierungsabhängig[bearbeiten]

[bearbeiten] 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]
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]
entsperrt den Mutex
(public member function) [edit]
Native handle
gibt das implementierungsabhängige native Handle-Objekt zurück
(public member function) [bearbeiten]

[bearbeiten] Anmerkungen

std::mutex wird normalerweise nicht direkt verwendet: std::unique_lock, std::lock_guard, oder std::scoped_lock(seit C++17) verwalten das Sperren auf eine ausnahme-sicherere Weise.

[bearbeiten] Beispiel

Dieses Beispiel zeigt, wie ein mutex verwendet werden kann, um eine zwischen zwei Threads gemeinsam genutzte std::map zu schützen.

#include <chrono>
#include <iostream>
#include <map>
#include <mutex>
#include <string>
#include <thread>
 
std::map<std::string, std::string> g_pages;
std::mutex g_pages_mutex;
 
void save_page(const std::string& url)
{
    // simulate a long page fetch
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::string result = "fake content";
 
    std::lock_guard<std::mutex> guard(g_pages_mutex);
    g_pages[url] = result;
}
 
int main() 
{
    std::thread t1(save_page, "http://foo");
    std::thread t2(save_page, "http://bar");
    t1.join();
    t2.join();
 
    // safe to access g_pages without lock now, as the threads are joined
    for (const auto& [url, page] : g_pages)
        std::cout << url << " => " << page << '\n';
}

Ausgabe

http://bar => fake content
http://foo => fake content

[bearbeiten] Siehe auch

bietet Gegenseitiger-Ausschluss-Funktionen, die von demselben Thread rekursiv gesperrt werden können
(Klasse) [bearbeiten]
implementiert einen streng bereichsbezogenen Mutex-Besitz-Wrapper
(Klassen-Template) [bearbeiten]
implementiert verschiebbaren Mutex-Besitz-Wrapper
(Klassenvorlage) [bearbeiten]
todesfallsichere RAII-Hülle für mehrere Mutexe
(Klassen-Template) [bearbeiten]
bietet eine Bedingungsvariable, die mit einem std::unique_lock verbunden ist
(Klasse) [bearbeiten]