std::unique_lock<Mutex>:: unique_lock
From cppreference.net
<
cpp
|
thread
|
unique lock
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::unique_lock
| Member functions | ||||
|
unique_lock::unique_lock
|
||||
| Locking | ||||
| Modifiers | ||||
| Observers | ||||
| Non-member functions | ||||
|
unique_lock
(
)
noexcept
;
|
(1) | (desde C++11) |
|
unique_lock
(
unique_lock
&&
other
)
noexcept
;
|
(2) | (desde C++11) |
|
explicit
unique_lock
(
mutex_type
&
m
)
;
|
(3) | (desde C++11) |
|
unique_lock
(
mutex_type
&
m,
std::
defer_lock_t
t
)
noexcept
;
|
(4) | (desde C++11) |
|
unique_lock
(
mutex_type
&
m,
std::
try_to_lock_t
t
)
;
|
(5) | (desde C++11) |
|
unique_lock
(
mutex_type
&
m,
std::
adopt_lock_t
t
)
;
|
(6) | (desde C++11) |
|
template
<
class
Rep,
class
Period
>
unique_lock
(
mutex_type
&
m,
|
(7) | (desde C++11) |
|
template
<
class
Clock,
class
Duration
>
unique_lock
(
mutex_type
&
m,
|
(8) | (desde C++11) |
Construye un
unique_lock
, opcionalmente bloqueando el mutex proporcionado.
1)
Construye un
unique_lock
sin mutex asociado.
2)
Constructor de movimiento. Inicializa el
unique_lock
con el contenido de
other
. Deja a
other
sin un mutex asociado.
3-8)
Construye un
unique_lock
con
m
como el mutex asociado. Adicionalmente:
3)
Bloquea el mutex asociado llamando a
m.
lock
(
)
.
4)
No bloquea el mutex asociado.
5)
Intenta bloquear el mutex asociado sin bloquearse llamando a
m.
try_lock
(
)
. El comportamiento es indefinido si
Mutex
no satisface
Lockable
.
6)
Asume que el hilo que realiza la llamada ya mantiene un bloqueo no compartido (es decir, un bloqueo adquirido mediante
lock
,
try_lock
,
try_lock_for
, o
try_lock_until
) en
m
. El comportamiento es indefinido si no es así.
7)
Intenta bloquear el mutex asociado llamando a
m.
try_lock_for
(
timeout_duration
)
. 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 satisface
TimedLockable
.
8)
Intenta bloquear el mutex asociado llamando a
m.
try_lock_until
(
timeout_time
)
. 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 satisface
TimedLockable
.
Parámetros
| other | - |
otro
unique_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 <iostream> #include <mutex> #include <thread> #include <utility> #include <vector> std::mutex m_a, m_b, m_c; int a, b, c = 1; void update() { { // Nota: std::lock_guard o atomic<int> pueden usarse en su lugar std::unique_lock<std::mutex> lk(m_a); ++a; } { // Nota: ver std::lock y std::scoped_lock para detalles y alternativas std::unique_lock<std::mutex> lk_b(m_b, std::defer_lock); std::unique_lock<std::mutex> lk_c(m_c, std::defer_lock); std::lock(lk_b, lk_c); b = std::exchange(c, b + c); } } int main() { std::vector<std::thread> threads; for (unsigned i = 0; i < 12; ++i) threads.emplace_back(update); for (auto& i : threads) i.join(); std::cout << a << "'th and " << a + 1 << "'th Fibonacci numbers: " << b << " and " << c << '\n'; }
Salida:
12'th and 13'th Fibonacci numbers: 144 and 233