std::unique_lock<Mutex>::try_lock
Von cppreference.com
< cpp | thread | unique lock
| bool try_lock(); |
(seit C++11) | |
Versucht, die zugeordnete Mutex zu sperren (d.h. den Besitz zu erlangen), ohne zu blockieren. Ruft effektiv mutex()->try_lock() auf.
std::system_error wird ausgelöst, wenn keine zugeordnete Mutex vorhanden ist oder wenn die Mutex bereits von diesem std::unique_lock gesperrt ist.
Inhalt |
[bearbeiten] Parameter
(keine)
[bearbeiten] Rückgabewert
true, wenn der Besitz des Mutex erfolgreich erworben wurde, andernfalls false.
[bearbeiten] Ausnahmen
- Alle von mutex()->try_lock() ausgelösten Ausnahmen (Mutex-Typen lösen in
try_lockkeine Ausnahmen aus, aber ein benutzerdefinierter Lockable könnte es).
- Wenn kein zugeordneter Mutex vorhanden ist, std::system_error mit einem Fehlercode von std::errc::operation_not_permitted.
- Wenn die Mutex bereits von diesem
std::unique_lockgesperrt ist, std::system_error mit dem Fehlercode std::errc::resource_deadlock_would_occur.
[bearbeiten] Beispiel
Die folgenden Beispiele versuchen, eine Mutex zu erwerben, die gesperrt und entsperrt wurde.
Führen Sie diesen Code aus
#include <chrono> #include <iostream> #include <mutex> #include <thread> #include <vector> using namespace std::chrono_literals; int main() { std::mutex counter_mutex; std::vector<std::thread> threads; using Id = int; auto worker_task = [&](Id id, std::chrono::seconds wait, std::chrono::seconds acquire) { // wait for a few seconds before acquiring lock. std::this_thread::sleep_for(wait); std::unique_lock<std::mutex> lock(counter_mutex, std::defer_lock); if (lock.try_lock()) std::cout << '#' << id << ", lock acquired.\n"; else { std::cout << '#' << id << ", failed acquiring lock.\n"; return; } // keep the lock for a while. std::this_thread::sleep_for(acquire); std::cout << '#' << id << ", releasing lock (via destructor).\n"; }; threads.emplace_back(worker_task, Id{0}, 0s, 2s); threads.emplace_back(worker_task, Id{1}, 1s, 0s); threads.emplace_back(worker_task, Id{2}, 3s, 0s); for (auto& thread : threads) thread.join(); }
Ausgabe
#0, lock acquired. #1, failed acquiring lock. #0, releasing lock (via destructor). #2, lock acquired. #2, releasing lock (via destructor).
[bearbeiten] Siehe auch
| sperrt den zugehörigen Mutex (d.h. übernimmt den Besitz) (public member function) | |
| versucht, den zugehörigen TimedLockable Mutex zu sperren (d.h. den Besitz zu übernehmen) und kehrt zurück, wenn der Mutex für die angegebene Zeitspanne nicht verfügbar war (public member function) | |
| versucht, den zugehörigen TimedLockable Mutex zu sperren (d.h. den Besitz zu übernehmen) und kehrt zurück, wenn der Mutex bis zum Erreichen des angegebenen Zeitpunkts nicht verfügbar war (public member function) | |
| entsperrt den zugehörigen Mutex (d.h. gibt den Besitz frei) (public member function) |