Namespaces
Variants

std::recursive_timed_mutex:: try_lock_for

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
template < class Rep, class Period >
bool try_lock_for ( const std:: chrono :: duration < Rep, Period > & timeout_duration ) ;
(desde C++11)

Intenta bloquear el mutex. Se bloquea hasta que transcurra la duración especificada timeout_duration (timeout) o se adquiera el bloqueo (posee el mutex), lo que ocurra primero. Si la adquisición del bloqueo es exitosa retorna true , en caso contrario retorna false .

Si timeout_duration es menor o igual a timeout_duration. zero ( ) , la función se comporta como try_lock() .

Esta función puede bloquearse por más tiempo que timeout_duration debido a demoras de planificación o contención de recursos.

El estándar recomienda que se utilice un std::steady_clock para medir la duración. Si una implementación utiliza un std::system_clock en su lugar, el tiempo de espera también puede ser sensible a los ajustes del reloj.

Al igual que con try_lock() , se permite que esta función falle espuriamente y devuelva false incluso si el mutex no estaba bloqueado por ningún otro hilo en algún momento durante timeout_duration .

La operación unlock() previa sobre el mismo mutex sincroniza-con (como se define en std::memory_order ) esta operación si retorna true .

Un hilo puede llamar a try_lock_for en un mutex recursivo repetidamente. Las llamadas exitosas a try_lock_for incrementan el contador de propiedad: el mutex solo se liberará después de que el hilo realice un número equivalente de llamadas a unlock() .

El número máximo de niveles de propiedad no está especificado. Una llamada a try_lock_for devolverá false si se excede este número.

Contenidos

Parámetros

timeout_duration - duración mínima para bloquear

Valor de retorno

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

Excepciones

Cualquier excepción lanzada por timeout_duration (las duraciones proporcionadas por la biblioteca estándar nunca lanzan excepciones).

Ejemplo

#include <chrono>
#include <iostream>
#include <mutex>
#include <sstream>
#include <thread>
#include <vector>
using namespace std::chrono_literals;
std::mutex cout_mutex; // controlar acceso a std::cout
std::timed_mutex mutex;
void job(int id)
{
    std::ostringstream stream;
    for (int i = 0; i < 3; ++i)
    {
        if (mutex.try_lock_for(100ms))
        {
            stream << "success ";
            std::this_thread::sleep_for(100ms);
            mutex.unlock();
        }
        else
            stream << "failed ";
        std::this_thread::sleep_for(100ms);
    }
    std::lock_guard<std::mutex> lock{cout_mutex};
    std::cout << '[' << id << "] " << stream.str() << '\n';
}
int main()
{
    std::vector<std::thread> threads;
    for (int i{0}; i < 4; ++i)
        threads.emplace_back(job, i);
    for (auto& th : threads)
        th.join();
}

Salida posible:

[0] failed failed failed 
[3] failed failed success 
[2] failed success failed 
[1] success failed success

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2093 C++11 try_lock_for no lanzaba nada lanza excepciones relacionadas con timeout

Véase también

bloquea el mutex, se bloquea si el mutex no está disponible
(función miembro pública)
intenta bloquear el mutex, retorna si el mutex no está disponible
(función miembro pública)
intenta bloquear el mutex, retorna si el mutex ha estado
no disponible hasta que se alcanza el punto de tiempo especificado
(función miembro pública)
desbloquea el mutex
(función miembro pública)