std::mutex
Aus cppreference.com
<tbody>
</tbody>
| 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
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 einenfalseRü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 .
Mitglied Typen
| Mitglied Typ | Definition |
native_handle_type
|
Implementierungs definiert |
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) | |
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