std::mutex
Aus cppreference.com
| Defined 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
mutexvon dem Zeitpunkt an, wo er entweder erfolgreichlockodertry_lockaufgerufen hat, 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 desmutexanzufordern. - Ein aufrufender Thread darf nicht bereits im Besitz des
mutexsein, wenn erlockodertry_lockaufruft.
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,kehrt zurueck 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

