Namespaces
Variants

std:: mutex

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
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 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 mutex von dem Zeitpunkt an, zu dem er erfolgreich entweder lock oder try_lock aufruft, bis er unlock aufruft.
  • Wenn ein Thread einen mutex besitzt, werden alle anderen Threads blockiert (bei Aufrufen von lock ) oder erhalten einen false Rückgabewert (bei try_lock ), wenn sie versuchen, den Besitz des mutex zu übernehmen.
  • Ein aufrufender Thread darf den mutex nicht besitzen, bevor er lock oder try_lock aufruft.

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

Bietet eine Mutual-Exclusion-Einrichtung, die rekursiv durch denselben Thread gesperrt werden kann
(Klasse)
(C++11)
Implementiert einen streng bereichsbasierten Mutex-Eigentums-Wrapper
(Klassentemplate)
Implementiert einen beweglichen Mutex-Eigentums-Wrapper
(Klassentemplate)
Deadlock-vermeidender RAII-Wrapper für mehrere Mutexe
(Klassentemplate)
Bietet eine Condition-Variable, assoziiert mit einem std::unique_lock
(Klasse)