std::mutex
Aus cppreference.com
definiert in Header <mutex>
|
||
class mutex; |
(seit C++11) | |
Die mutex
Klasse ist eine Synchronisierungsgrundeinheit, die verwendet werden kann, um gemeinsame Daten vor gleichzeitigen Zugriffen aus mehreren Threads zu schützen.
mutex
bietet exklusive, nicht-rekursive Eigentumssemantik:
- Ein aufrufender Thread besitzt einen
mutex
von dem Zeitpunkt an, wo er entweder erfolgreichlock
odertry_lock
aufgerufen hat, bis erunlock
aufruft. - Wenn ein Thread einen
mutex
besitzt, werden alle anderen Threads blockiert (bei Aufrufen vonlock
) oder erhalten einen false Rückgabewert (beitry_lock
), wenn sie versuchen den Besitz desmutex
anzufordern. - Ein aufrufender Thread darf nicht bereits im Besitz des
mutex
sein, wenn erlock
odertry_lock
aufruft.
Das Verhalten eines Programms ist undefiniert, wenn ein mutex
zerstört wird, während er noch im Besitz eines Threads ist. Die mutex
Klasse ist nicht kopierbar .
Inhaltsverzeichnis |
[Bearbeiten] Mitglied Typen
Mitglied Typ | Definition |
native_handle_type
|
Implementierungs definiert |
[Bearbeiten] Member-Funktionen
konstruiert den Mutex (öffentliche Elementfunktion) | |
Sperren | |
sperrt den Mutex, blockiert wenn der Mutex nicht verfügbar ist (öffentliche Elementfunktion) | |
versucht den Mutex zu sperren und kehrt zurück, wenn der Mutex nicht verfügbar ist (öffentliche Elementfunktion) | |
entsperrt den Mutex (öffentliche Elementfunktion) | |
Natives Handle | |
gibt das zugrunde liegende implementierungsabhängige Thread-Handle zurück (öffentliche Elementfunktion) |
[Bearbeiten] Beispiel
Dieses Beispiel zeigt, wie ein mutex
verwendet werden kann, um eine std::map zu schützen, die zwischen zwei Threads geteilt wird.
#include <iostream> #include <chrono> #include <thread> #include <mutex> #include <map> #include <string> 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"; g_pages_mutex.lock(); g_pages[url] = result; g_pages_mutex.unlock(); } int main() { std::thread t1(save_page, "http://foo"); std::thread t2(save_page, "http://bar"); t1.join(); t2.join(); g_pages_mutex.lock(); for (const auto &pair : g_pages) { std::cout << pair.first << " => " << pair.second << '\n'; } g_pages_mutex.unlock(); }
Output:
http://bar => fake content http://foo => fake content