Espacios de nombres
Variantes

std::mutex::try_lock

De cppreference.com

[edit template]
 
 
Biblioteca de apoyo de concurrencia
Hilos
(C++11)
(C++20)
Espacio de nombres this_thread
(C++11)
(C++11)
(C++11)
Cancelación cooperativa
Exclusión mutua
(C++11)
Gestión genérica de bloqueo
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Variables de condición
(C++11)
Semáforos
Pestillos y barreras
(C++20)
(C++20)
Futuros
(C++11)
(C++11)
(C++11)
(C++11)
Recuperación segura
(C++26)
Punteros de riesgo
Tipos atómicos
(C++11)
(C++20)
Inicialización de tipos atómicos
(C++11)(en desuso en C++20)
(C++11)(en desuso en C++20)
Orden de memoria
Funciones independientes para operaciones atómicas
Funciones independientes para indicadores atómicos
 
 
<tbody> </tbody>
bool try_lock();
(desde C++11)

Intenta bloquear el mutex. Regresa inmediatamente. Si se tiene éxito en adquirir el bloqueo, devuelve true, de lo contrario devuelve false.

Se permite que esta función falle falsamente (spuriously) y devuelva false incluso si el mutex no se encuentra actualmente bloqueado por ningún otro hilo.

Si try_lock se llama por un hilo que ya posee el mutex, el comportamiento no está definido.

Una llamada previa a unlock() en el mismo mutex se sincroniza-con (como se define en std::memory_order) esta operación si devuelve true. Observa que una llamada previa a lock() no se sincroniza con esta operación si devuelve false.

Parámetros

(Ninguno)

Valor de retorno

true si se adquirió el bloqueo con éxito, de lo contrario false.

Excepciones

No lanza nada.

Ejemplo

#include <chrono>
#include <mutex>
#include <thread>
#include <iostream> // std::cout

std::chrono::milliseconds interval(100);

std::mutex mutex;
int job_shared = 0;    // ambos hilos pueden modificar a 'job_shared',
                       // el mutex protegerá esta variable

int job_exclusive = 0; // solo un hilo puede modificar a 'job_exclusive'
                       // no se necesita protección

// este hilo puede modificar tanto a 'job_shared' como a 'job_exclusive'
void job_1() 
{
    std::this_thread::sleep_for(interval); // dejemos que 'job_2' tome un cerrojo

    while (true) {
        // tratar de bloquear el mutex para modificar a 'job_shared'
        if (mutex.try_lock()) {
            std::cout << "trabajo compartido (" << job_shared << ")\n";
            mutex.unlock();
            return;
        } else {
            // no se puede obtener el cerrojo para modificar a 'job_shared'
            // pero hay más trabajo por hacer
            ++job_exclusive;
            std::cout << "trabajo exclusivo (" << job_exclusive << ")\n";
            std::this_thread::sleep_for(interval);
        }
    }
}

// este hilo solo puede modificar a '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();
}

Posible salida:

trabajo exclusivo (1)
trabajo exclusivo (2)
trabajo exclusivo (3)
trabajo exclusivo (4)
trabajo compartido (1)

Véase también

Bloquea el mutex; se bloquea si el mutex no está disponible
(función miembro pública) [editar]
Desbloquea el mutex
(función miembro pública) [editar]
Documentación de C para mtx_trylock