std::shared_timed_mutex::try_lock_for
| template< class Rep, class Period > bool try_lock_for( const std::chrono::duration<Rep, Period>& timeout_duration ); |
(seit C++14) | |
Versucht, die Mutex zu sperren. Blockiert, bis die angegebene Dauer timeout_duration abgelaufen ist (Timeout) oder die Sperre erworben wurde (besitzt den Mutex), je nachdem, was zuerst eintritt. Bei erfolgreichem Erwerb der Sperre wird true zurückgegeben, andernfalls false.
Wenn timeout_duration kleiner oder gleich timeout_duration.zero() ist, verhält sich die Funktion wie try_lock().
Diese Funktion kann aufgrund von Planungs- oder Ressourcenkonfliktverzögerungen länger als timeout_duration blockieren.
Der Standard empfiehlt die Verwendung von std::steady_clock zur Messung der Dauer. Wenn eine Implementierung stattdessen std::system_clock verwendet, kann die Wartezeit auch empfindlich auf Uhrenanpassungen reagieren.
Wie bei try_lock() darf diese Funktion fehlerhaft fehlschlagen und false zurückgeben, auch wenn der Mutex zu keinem Zeitpunkt während timeout_duration von einem anderen Thread gesperrt wurde.
Eine vorherige unlock()-Operation auf demselben Mutex synchronisiert sich mit dieser Operation (wie in std::memory_order definiert), wenn diese true zurückgibt.
Wenn try_lock_for von einem Thread aufgerufen wird, der den Mutex bereits in irgendeinem Modus (geteilt oder exklusiv) besitzt, ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Parameter
| timeout_duration | - | minimale Dauer für das Blockieren |
[bearbeiten] Rückgabewert
true, wenn die Sperre erfolgreich erworben wurde, andernfalls false.
[bearbeiten] Ausnahmen
Alle von timeout_duration geworfenen Ausnahmen (Dauern, die von der Standardbibliothek bereitgestellt werden, werfen niemals Ausnahmen).
[bearbeiten] Beispiel
#include <chrono> #include <iostream> #include <mutex> #include <sstream> #include <thread> #include <vector> using namespace std::chrono_literals; std::mutex cout_mutex; // control access to std::cout std::timed_mutex mutex; void job(int id) { std::ostringstream stream; for (int i = 0; i < 3; ++i) { if (mutex.try_lock_for(100ms)) { stream << "success "; std::this_thread::sleep_for(100ms); mutex.unlock(); } else stream << "failed "; std::this_thread::sleep_for(100ms); } std::lock_guard<std::mutex> lock{cout_mutex}; std::cout << '[' << id << "] " << stream.str() << '\n'; } int main() { std::vector<std::thread> threads; for (int i{0}; i < 4; ++i) threads.emplace_back(job, i); for (auto& th : threads) th.join(); }
Mögliche Ausgabe
[0] failed failed failed [3] failed failed success [2] failed success failed [1] success failed success
[bearbeiten] Siehe auch
| sperrt den Mutex, blockiert, wenn der Mutex nicht verfügbar ist (public member function) | |
| versucht, den Mutex zu sperren, kehrt zurück, wenn der Mutex nicht verfügbar ist (public member function) | |
| versucht, den Mutex zu sperren, kehrt zurück, wenn der Mutex bis zum Erreichen des angegebenen Zeitpunktpunkts nicht verfügbar (public member function) | |
| entsperrt den Mutex (public member function) |