std::shared_lock<Mutex>::shared_lock
De cppreference.com
<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
Ejecuta este código
#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...