Namespaces
Variants

std::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 el mutex. Retorna inmediatamente. Si la adquisición del bloqueo es exitosa retorna true , de lo contrario retorna false .

Esta función puede fallar esporádicamente y devolver false incluso si el mutex no está actualmente bloqueado por ningún otro hilo.

Si try_lock es llamado por un hilo que ya posee el mutex , el comportamiento es indefinido.

La operación previa unlock() en el mismo mutex sincroniza-con (como se define en std::memory_order ) esta operación si retorna true . Nótese que la operación previa lock() no se sincroniza con esta operación si retorna false .

Contenidos

Parámetros

(ninguno)

Valor de retorno

true si el bloqueo se adquirió exitosamente, de lo contrario false .

Excepciones

No lanza nada.

Ejemplo

#include <chrono>
#include <iostream> // std::cout
#include <mutex>
#include <thread>
std::chrono::milliseconds interval(100);
std::mutex mutex;
int job_shared = 0; // ambos hilos pueden modificar 'job_shared',
                    // mutex protegerá esta variable
int job_exclusive = 0; // solo un hilo puede modificar 'job_exclusive'
                       // no se necesita protección
// este hilo puede modificar tanto 'job_shared' como 'job_exclusive'
void job_1() 
{
    std::this_thread::sleep_for(interval); // permitir que 'job_2' tome un bloqueo
    while (true)
    {
        // intentar bloquear mutex para modificar 'job_shared'
        if (mutex.try_lock())
        {
            std::cout << "job shared (" << job_shared << ")\n";
            mutex.unlock();
            return;
        }
        else
        {
            // no se puede obtener el bloqueo para modificar 'job_shared'
            // pero hay otro trabajo por hacer
            ++job_exclusive;
            std::cout << "job exclusive (" << job_exclusive << ")\n";
            std::this_thread::sleep_for(interval);
        }
    }
}
// este hilo puede modificar solo 'job_shared'
void job_2() 
{
    mutex.lock();
    std::this_thread::sleep_for(5 * interval);
    ++job_shared;
    mutex.unlock();
}
int main() 
{
    std::thread thread_1(job_1);
    std::thread thread_2(job_2);
    thread_1.join();
    thread_2.join();
}

Salida posible:

job exclusive (1)
job exclusive (2)
job exclusive (3)
job exclusive (4)
job shared (1)

Véase también

bloquea el mutex, se bloquea si el mutex no está disponible
(función miembro pública)
desbloquea el mutex
(función miembro pública)
Documentación C para mtx_trylock