std:: mutex
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
| Native handle | ||||
|
Definiert im Header
<mutex>
|
||
|
class
mutex
;
|
(seit C++11) | |
Die
mutex
-Klasse ist ein Synchronisierungsprimitiv, das verwendet werden kann, um gemeinsame Daten vor gleichzeitigem Zugriff durch mehrere Threads zu schützen.
mutex
bietet exklusive, nicht-rekursive Besitzsemantik:
-
Ein aufrufender Thread
besitzt
einen
mutexvon dem Zeitpunkt an, zu dem er erfolgreich entwederlockodertry_lockaufruft, bis erunlockaufruft. -
Wenn ein Thread einen
mutexbesitzt, werden alle anderen Threads blockiert (bei Aufrufen vonlock) oder erhalten einen false Rückgabewert (beitry_lock), wenn sie versuchen, den Besitz desmutexzu übernehmen. -
Ein aufrufender Thread darf den
mutexnicht besitzen, bevor erlockodertry_lockaufruft.
Das Verhalten eines Programms ist undefiniert, wenn ein
mutex
zerstört wird, während er noch von Threads gehalten wird, oder ein Thread terminiert, während er einen
mutex
besitzt. Die
mutex
-Klasse erfüllt alle Anforderungen von
Mutex
und
StandardLayoutType
.
std::mutex
ist weder kopierbar noch verschiebbar.
Inhaltsverzeichnis |
Verschachtelte Typen
| Name | 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) |
|
Hinweise
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 ausnahmesicherere Weise.
Beispiel
Dieses Beispiel zeigt, wie ein
mutex
verwendet werden kann, um eine
std::map
zu schützen, die zwischen zwei Threads geteilt wird.
#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
Siehe auch
|
(C++11)
|
Bietet eine Mutual-Exclusion-Einrichtung, die rekursiv durch denselben Thread gesperrt werden kann
(Klasse) |
|
(C++11)
|
Implementiert einen streng bereichsbasierten Mutex-Eigentums-Wrapper
(Klassentemplate) |
|
(C++11)
|
Implementiert einen beweglichen Mutex-Eigentums-Wrapper
(Klassentemplate) |
|
(C++17)
|
Deadlock-vermeidender RAII-Wrapper für mehrere Mutexe
(Klassentemplate) |
|
(C++11)
|
Bietet eine Condition-Variable, assoziiert mit einem
std::unique_lock
(Klasse) |