std::recursive_mutex
De cppreference.com
<tbody>
</tbody>
| Definido en el archivo de encabezado <mutex>
|
||
class recursive_mutex; |
(desde C++11) | |
La clase recursive_mutex es una primitiva de sincronización que se puede usar para proteger los datos compartidos para que no se accedan simultáneamente por varios hilos.
recursive_mutex ofrece semántica de propiedad recursiva exclusiva:
- Un hilo llamante posee un
recursive_mutexdurante un período de tiempo que comienza cuando llama con éxito alockotry_lock. Durante este período, el hilo puede realizar llamadas adicionales alockotry_lock. El período de posesión termina cuando el hilo hace un número coincidente de llamadas aunlock. - Cuando un hilo posee un
recursive_mutex, todos los demás hilos se bloquearán (para llamadas alock) o recibirán un valor de retornofalse(paratry_lock) si intentan reclamar la posesión delrecursive_mutex. - El número máximo de veces que se puede bloquear un
recursive_mutexno está especificado, pero una vez que se alcanza ese número, las llamadas alocklanzarán std::system_error y las llamadas atry_lockdevolveránfalse.
El comportamiento de un programa no está definido si se destruye un recursive_mutex mientras todavía es posesión de algún hilo. La clase recursive_mutex satisface todos los requerimientos de Mutex y StandardLayoutType.
Tipos miembro
| Tipo miembro | Definición |
native_handle_type(no siempre está presente)
|
definido por la implementación |
Funciones miembro
| Construye el mutex (función miembro pública) | |
| Destruye el mutex (función miembro pública) | |
operator= [eliminada] |
No es asignable mediante 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; regresa si el mutex no está disponible (función miembro pública) | |
| Desbloquea el mutex (función miembro pública) | |
Identificador nativo | |
| Devuelve el identificador nativo subyacente definido por la implementación (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í.
Ejecuta este código
#include <iostream>
#include <thread>
#include <mutex>
class X {
std::recursive_mutex m;
std::string compartida; // cadena compartida
public:
void fun1() {
std::lock_guard<std::recursive_mutex> lk(m);
compartida = "fun1";
std::cout << "en fun1, la variable compartida ahora es " << compartida << '\n';
}
void fun2() {
std::lock_guard<std::recursive_mutex> lk(m);
compartida = "fun2";
std::cout << "en fun2, la variable compartida " << compartida << '\n';
fun1(); // aquí el bloqueo recursivo se hace útil
std::cout << "de vuelta a fun2, la variable compartida es " << compartida << '\n';
};
};
int main()
{
X x;
std::thread t1(&X::fun1, &x);
std::thread t2(&X::fun2, &x);
t1.join();
t2.join();
}
Posible salida:
en fun1, la variable compartida ahora es fun1
en fun2, la variable compartida fun2
en fun1, la variable compartida ahora es fun1
de regreso a fun2, la variable compartida es fun1