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(conststd::string&url){// simulate a long page fetchstd::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(constauto&pair : g_pages){std::cout<< pair.first<<" => "<< pair.second<<'\n';} g_pages_mutex.unlock();}
Output:
http://bar => fake content http://foo => fake content