Espacios de nombres
Variantes

std::shared_lock<Mutex>::shared_lock

De cppreference.com
 
 
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)
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
 
 
<tbody> </tbody>
shared_lock() noexcept;
(1) (desde C++14)
shared_lock( shared_lock&& other ) noexcept;
(2) (desde C++14)
explicit shared_lock( mutex_type& m );
(3) (desde C++14)
shared_lock( mutex_type& m, std::defer_lock_t t ) noexcept;
(4) (desde C++14)
shared_lock( mutex_type& m, std::try_to_lock_t t );
(5) (desde C++14)
shared_lock( mutex_type& m, std::adopt_lock_t t );
(6) (desde C++14)
template< class Rep, class Period > shared_lock( mutex_type& m, const std::chrono::duration<Rep,Period>& timeout_duration );
(7) (desde C++14)
template< class Clock, class Duration > shared_lock( mutex_type& m, const std::chrono::time_point<Clock,Duration>& timeout_time );
(8) (desde C++14)

Construye un shared_lock, bloqueando opcionalmente el mutex suplementado.

1) Construye un shared_lock sin un mutex asociado.
2) Constructor de movimiento. Inicializa el shared_lock con el contenido de other. Deja a other sin un mutex asociado.
3-8) Construye un shared_lock con m como el mutex asociado. Además:
3) Bloquea el mutex asociado en modalidad compartida llamando a m.lock_shared(). El comportamiento no está definido si el hilo actual ya posee el mutex en cualquier modalidad.
4) No bloquea el mutex asociado.
5) Intenta bloquear el mutex asociado en modalidad compartida sin bloquearse llamando a m.try_lock_shared(). El comportamiento no está definido si el hilo actual ya posee el mutex en cualquier modalidad.
6) Supone que el hilo llamante ya posee a m en modalidad compartida.
7) Intenta bloquear el mutex asociado en modalidad compartida llamando a m.try_lock_shared_for(timeout_duration). Se bloquea hasta que la duración del tiempo de espera timeout_duration haya transcurrido o el cerrojo se adquiera, lo que suceda primero. Puede bloquearse por un período más largo que timeout_duration. El comportamiento no está definido si el hilo actual ya posee el mutex en cualquier modalidad.
8) Intenta bloquear el mutex asociado en modalidad compartida llamando a m.try_lock_shared_until(timeout_time). Se bloquea hasta que se alcance el tiempo de espera timeout_time o se adquiera el cerrojo, lo que suceda primero. Puede bloquearse por un período más largo hasta que se alcance el tiempo de espera timeout_time. El comportamiento no está definido si el hilo actual ya posee el mutex en cualquier modalidad.

Parámetros

other - Otro objeto unique_lock con el cual inicializar el estado.
m - Mutex con el cual asociar el cerrojo y del cual, opcionalmente, tomar posesión.
t - Parámetro de etiqueta usado para seleccionar los constructores con distintas estrategias de bloqueo.
timeout_duration - Duración máxima a bloquearse.
timeout_time - Punto de tiempo máximo hasta el cual bloquearse.

Ejemplo

#include <shared_mutex>
#include <iostream>
#include <thread>
#include <chrono>

std::shared_timed_mutex m;
int i = 10;

void leer()
{
   // ambos hilos obtienen acceso al entero i
   std::shared_lock<std::shared_timed_mutex> slk(m);
   std::cout << "leer i como " << i << "...\n"; // esto no está sincronizado
   std::this_thread::sleep_for(std::chrono::milliseconds(10));
   std::cout << "ha despertado...\n";
}

int main()
{
   std::thread r1(leer);
   std::thread r2(leer);

   r1.join();
   r2.join();
   return 0;
}

Salida:

leer i como 10...
leer i como 10...
ha despertado...
ha despertado...