Espacios de nombres
Variantes
Acciones

std::mutex::try_lock

De cppreference.com
< cpp‎ | thread‎ | mutex
 
 
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
 
std::mutex
Funciones miembro
Bloqueo
mutex::try_lock
Identificador nativo
 
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.

Contenido

[editar] Parámetros

(Ninguno)

[editar] Valor de retorno

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

[editar] Excepciones

No lanza nada.

[editar] 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)

[editar] 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