Namespaces
Variants

std:: recursive_mutex

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
(C++11)
recursive_mutex
(C++11)
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
Definido en el encabezado <mutex>
class recursive_mutex ;
(desde C++11)

La clase recursive_mutex es un primitivo de sincronización que puede utilizarse para proteger datos compartidos de ser accedidos simultáneamente por múltiples hilos.

recursive_mutex ofrece semánticas de propiedad exclusiva y recursiva:

  • Un hilo que realiza la llamada posee un recursive_mutex durante un período de tiempo que comienza cuando llama exitosamente a lock o try_lock . Durante este período, el hilo puede realizar llamadas adicionales a lock o try_lock . El período de posesión finaliza cuando el hilo realiza un número equivalente de llamadas a unlock .
  • Cuando un hilo posee un recursive_mutex , todos los demás hilos se bloquearán (para llamadas a lock ) o recibirán un valor de retorno false (para try_lock ) si intentan reclamar la posesión del recursive_mutex .
  • El número máximo de veces que un recursive_mutex puede ser bloqueado no está especificado, pero después de alcanzar ese número, las llamadas a lock lanzarán std::system_error y las llamadas a try_lock devolverán false .

El comportamiento de un programa es indefinido si un recursive_mutex es destruido mientras aún está siendo poseído por algún hilo. La clase recursive_mutex satisface todos los requisitos de Mutex y StandardLayoutType .

Contenidos

Tipos de miembros

Tipo de miembro Definición
native_handle_type ( opcional* ) definido por la implementación

Funciones miembro

construye el mutex
(función miembro pública)
destruye el mutex
(función miembro pública)
operator=
[deleted]
no asignable por copia
(función miembro pública)
Bloqueo
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)
desbloquea el mutex
(función miembro pública)
Manejador nativo
retorna el objeto de manejador nativo definido por la implementación subyacente
(función miembro pública)

Ejemplo

Un caso de uso para recursive_mutex es proteger el estado compartido en una clase cuyas funciones miembro pueden llamarse entre sí.

#include <iostream>
#include <mutex>
#include <thread>
class X
{
    std::recursive_mutex m;
    std::string shared;
public:
    void fun1()
    {
        std::lock_guard<std::recursive_mutex> lk(m);
        shared = "fun1";
        std::cout << "in fun1, shared variable is now " << shared << '\n';
    }
    void fun2()
    {
        std::lock_guard<std::recursive_mutex> lk(m);
        shared = "fun2";
        std::cout << "in fun2, shared variable is now " << shared << '\n';
        fun1(); // recursive lock becomes useful here
        std::cout << "back in fun2, shared variable is " << shared << '\n';
    }
};
int main() 
{
    X x;
    std::thread t1(&X::fun1, &x);
    std::thread t2(&X::fun2, &x);
    t1.join();
    t2.join();
}

Salida posible:

in fun1, shared variable is now fun1
in fun2, shared variable is now fun2
in fun1, shared variable is now fun1
back in fun2, shared variable is fun1

Véase también

(C++11)
proporciona funcionalidad básica de exclusión mutua
(clase)