Namespaces
Variants

std::unique_lock<Mutex>:: try_lock

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
bool try_lock ( ) ;
(seit C++11)

Versucht, den zugehörigen Mutex zu sperren (d.h. die Eigentümerschaft zu übernehmen), ohne zu blockieren. Ruft effektiv mutex ( ) - > try_lock ( ) auf.

std::system_error wird ausgelöst, wenn kein assoziierter Mutex vorhanden ist oder wenn der Mutex bereits von diesem std::unique_lock gesperrt wurde.

Inhaltsverzeichnis

Parameter

(keine)

Rückgabewert

true falls der Besitz des Mutex erfolgreich erlangt wurde, false andernfalls.

Ausnahmen

  • Alle Ausnahmen, die von mutex ( ) - > try_lock ( ) geworfen werden ( Mutex -Typen werfen keine Ausnahmen in try_lock , aber ein benutzerdefiniertes Lockable könnte dies tun).

Beispiel

Die folgenden Beispiele versuchen, einen Mutex zu erlangen, der gesperrt und entsperrt wurde.

#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).

Siehe auch

sperrt (d.h. übernimmt den Besitz) des zugehörigen Mutex
(öffentliche Elementfunktion)
versucht, den zugehörigen TimedLockable Mutex zu sperren (d.h. den Besitz zu übernehmen), gibt zurück, wenn der Mutex für die angegebene Zeitdauer nicht verfügbar war
(öffentliche Elementfunktion)
versucht, den zugehörigen TimedLockable Mutex zu sperren (d.h. den Besitz zu übernehmen), gibt zurück, wenn der Mutex bis zum Erreichen des angegebenen Zeitpunkts nicht verfügbar war
(öffentliche Elementfunktion)
entsperrt (d.h. gibt den Besitz frei) des zugehörigen Mutex
(öffentliche Elementfunktion)