std::mutex
| 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
mutexab dem Zeitpunkt, an dem er erfolgreich entwederlockodertry_lockaufruft, bis erunlockaufruft. - Wenn ein Thread ein
mutexbesitzt, werden alle anderen Threads blockiert (bei Aufrufen vonlock) oder erhalten einen Rückgabewert von false (fürtry_lock), wenn sie versuchen, das Eigentum an demmutexzu beanspruchen. - Ein aufrufender Thread darf das
mutexnicht bereits besitzen, bevor erlockodertry_lockaufruft.
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] Memberfunktionen
| konstruiert den Mutex (public member function) | |
| zerstört den Mutex (public member function) | |
| operator= [gelöscht] |
nicht kopierbar (public member function) |
Sperren | |
| sperrt den Mutex, blockiert, wenn der Mutex nicht verfügbar ist (public member function) | |
| versucht, den Mutex zu sperren, kehrt zurück, wenn der Mutex nicht verfügbar ist (public member function) | |
| entsperrt den Mutex (public member function) | |
Native handle | |
| gibt das implementierungsabhängige native Handle-Objekt zurück (public member function) | |
[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
| (C++11) |
bietet Gegenseitiger-Ausschluss-Funktionen, die von demselben Thread rekursiv gesperrt werden können (Klasse) |
| (C++11) |
implementiert einen streng bereichsbezogenen Mutex-Besitz-Wrapper (Klassen-Template) |
| (C++11) |
implementiert verschiebbaren Mutex-Besitz-Wrapper (Klassenvorlage) |
| (C++17) |
todesfallsichere RAII-Hülle für mehrere Mutexe (Klassen-Template) |
| (C++11) |
bietet eine Bedingungsvariable, die mit einem std::unique_lock verbunden ist (Klasse) |