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 ( ) ;
(desde C++11)

Intenta bloquear (es decir, tomar posesión de) el mutex asociado sin bloquearse. Efectivamente llama a mutex ( ) - > try_lock ( ) .

std::system_error se lanza si no hay un mutex asociado o si el mutex ya está bloqueado por este std::unique_lock .

Contenidos

Parámetros

(ninguno)

Valor de retorno

true si la propiedad del mutex ha sido adquirida exitosamente, false en caso contrario.

Excepciones

  • Cualquier excepción lanzada por mutex ( ) - > try_lock ( ) (los tipos Mutex no lanzan excepciones en try_lock , pero un Lockable personalizado podría).

Ejemplo

Los siguientes ejemplos intentan adquirir un mutex que fue bloqueado y desbloqueado.

#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();
}

Salida:

#0, lock acquired.
#1, failed acquiring lock.
#0, releasing lock (via destructor).
#2, lock acquired.
#2, releasing lock (via destructor).

Véase también

bloquea (es decir, toma posesión de) el mutex asociado
(función miembro pública)
intenta bloquear (es decir, tomar posesión de) el mutex TimedLockable asociado, retorna si el mutex ha estado indisponible durante la duración de tiempo especificada
(función miembro pública)
intenta bloquear (es decir, tomar posesión de) el mutex TimedLockable asociado, retorna si el mutex ha estado indisponible hasta que se alcanza el punto de tiempo especificado
(función miembro pública)
desbloquea (es decir, libera la posesión de) el mutex asociado
(función miembro pública)