Espacios de nombres
Variantes
Acciones

std::shared_timed_mutex

De cppreference.com
< cpp‎ | thread
 
 
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)
shared_timed_mutex
(C++14)
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
 
 
Definido en el archivo de encabezado <shared_mutex>
class shared_timed_mutex;
(desde C++14)

La clase shared_timed_mutex es una primitiva de sincronización que se puede utilizar para proteger datos compartidos de un acceso simultáneo por varios hilos/subprocesos. A diferencia de otros tipos mutex que facilitan el acceso exclusivo, un shared_timed_mutex tiene dos modalidades de acceso:

  • compartida - varios hilos pueden compartir la propiedad del mismo mutex.
  • exclusiva - solo un hilo puede poseer el mutex.

Los mutex compartidos se usan generalmente en situaciones en las que varios lectores pueden acceder al mismo recurso al mismo tiempo sin causar carreras de datos, pero solo un escritor puede hacerlo.

De manera similar a timed_mutex, shared_timed_mutex proporciona la habilidad de intentar reclamar la propiedad de un shared_timed_mutex con un tiempo de espera a través de las funciones miembro try_lock_for(), try_lock_until(), try_lock_shared_for(), try_lock_shared_until().

La clase shared_timed_mutex satisface todos los requerimientos de SharedTimedMutex y StandardLayoutType.

Contenido

[editar] Funciones miembro

Construye el mutex
(función miembro pública) [editar]
Destruye el mutex
(función miembro pública) [editar]
operator=
[eliminada]
No es asignable mediante copia
(función miembro pública) [editar]
Bloqueo exclusivo
Bloquea el mutex; se bloquea si el mutex no está disponible
(función miembro pública) [editar]
Intenta bloquear el mutex; regresa si el mutex no está disponible
(función miembro pública) [editar]
Intenta bloquear el mutex; regresa si el mutex no ha estado
disponible durante el tiempo de espera especificado
(función miembro pública) [editar]
Intenta bloquear el mutex; regresa si el mutex no ha estado
disponible hasta que se haya alcanzado el punto de tiempo especificado
(función miembro pública) [editar]
Desbloquea el mutex
(función miembro pública) [editar]
Bloqueo compartido
Bloquea el mutex para propiedad compartida; se bloquea si el mutex no está disponible
(función miembro pública) [editar]
Intenta bloquear el mutex para propiedad compartida; regresa si el mutex no está disponible
(función miembro pública) [editar]
Intenta bloquear el mutex para propiedad compartida; regresa si el mutex no ha estado
disponible durante el tiempo de espera especificado
(función miembro pública) [editar]
Intenta bloquear el mutex para propiedad compartida; regresa si el mutex no ha estado
disponible hasta que se haya alcanzado el punto de tiempo especificado
(función miembro pública) [editar]
Desbloquea el mutex (propiedad compartida)
(función miembro pública) [editar]

[editar] Ejemplo

Un operador de asignación de copia para una clase que mantiene recursos que pueden manejar múltiples lectores, pero solo un escritor.

#include <mutex>
#include <shared_mutex>
 
class R
{
    mutable std::shared_timed_mutex mut;
    /* datos */
public:
    R& operator=(const R& other)
    {
        // requiere propiedad exclusiva para escribir a *this
        std::unique_lock<std::shared_timed_mutex> lhs(mut, std::defer_lock);
        // requiere propiedad compartida para leer de other
        std::shared_lock<std::shared_timed_mutex> rhs(other.mut, std::defer_lock);
        std::lock(lhs, rhs);
        /* asignar datos */
        return *this;
    }
};
 
int main() {
    R r;
}