std:: recursive_mutex
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
| Native handle | ||||
|
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_mutexdurante un período de tiempo que comienza cuando llama exitosamente alockotry_lock. Durante este período, el hilo puede realizar llamadas adicionales alockotry_lock. El período de posesión finaliza cuando el hilo realiza un número equivalente 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 retorno false (paratry_lock) si intentan reclamar la posesión delrecursive_mutex. -
El número máximo de veces que un
recursive_mutexpuede ser bloqueado no está especificado, pero después de alcanzar ese número, las llamadas alocklanzarán std::system_error y las llamadas atry_lockdevolverá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) |