std::shared_lock<Mutex>:: shared_lock
From cppreference.net
<
cpp
|
thread
|
shared lock
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::shared_lock
| Member functions | ||||
|
shared_lock::shared_lock
|
||||
| Shared locking | ||||
| Modifiers | ||||
| Observers | ||||
| Non-member functions | ||||
|
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,
|
(7) | (desde C++14) |
|
template
<
class
Clock,
class
Duration
>
shared_lock
(
mutex_type
&
m,
|
(8) | (desde C++14) |
Construye un
shared_lock
, opcionalmente bloqueando el mutex proporcionado.
1)
Construye un
shared_lock
sin 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. Adicionalmente:
3)
Bloquea el mutex asociado en modo compartido llamando a
m.
lock_shared
(
)
.
4)
No bloquea el mutex asociado.
5)
Intenta bloquear el mutex asociado en modo compartido sin bloquear llamando a
m.
try_lock_shared
(
)
.
6)
Asume que el hilo que realiza la llamada ya mantiene un bloqueo compartido (es decir, un bloqueo adquirido mediante
lock_shared
,
try_lock_shared
,
try_lock_shared_for
, o
try_lock_shared_until
) en
m
. El comportamiento no está definido si no es así.
7)
Intenta bloquear el mutex asociado en modo compartido llamando a
m.
try_lock_shared_for
(
timeout_duration
)
, lo cual se bloquea hasta que el
timeout_duration
especificado haya transcurrido o se adquiera el bloqueo, lo que ocurra primero. Puede bloquearse por más tiempo que
timeout_duration
. El comportamiento es indefinido si
Mutex
no cumple con los requisitos de
SharedTimedLockable
.
8)
Intenta bloquear el mutex asociado en modo compartido llamando a
m.
try_lock_shared_until
(
timeout_time
)
, que se bloquea hasta que se alcanza el
timeout_time
especificado o se adquiere el bloqueo, lo que ocurra primero. Puede bloquearse durante más tiempo que hasta que se alcance el
timeout_time
. El comportamiento es indefinido si
Mutex
no cumple con los requisitos de
SharedTimedLockable
.
Parámetros
| other | - |
otro
shared_lock
para inicializar el estado
|
| m | - | mutex para asociar con el bloqueo y opcionalmente adquirir propiedad |
| t | - | parámetro de etiqueta utilizado para seleccionar constructores con diferentes estrategias de bloqueo |
| timeout_duration | - | duración máxima para bloquear |
| timeout_time | - | punto de tiempo máximo para bloquear hasta |
Ejemplo
Ejecutar este código
#include <chrono> #include <iostream> #include <shared_mutex> #include <syncstream> #include <thread> std::shared_timed_mutex m; int i = 10; void read_shared_var(int id) { // ambos hilos obtienen acceso al entero i std::shared_lock<std::shared_timed_mutex> slk(m); const int ii = i; // lee i global std::osyncstream(std::cout) << '#' << id << " read i as " << ii << "...\n"; std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::osyncstream(std::cout) << '#' << id << " woke up..." << std::endl; } int main() { std::thread r1{read_shared_var, 1}; std::thread r2{read_shared_var, 2}; r1.join(); r2.join(); }
Salida posible:
#2 read i as 10... #1 read i as 10... #2 woke up... #1 woke up...