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) | (depuis C++11) |
|
unique_lock
(
unique_lock
&&
other
)
noexcept
;
|
(2) | (depuis C++11) |
|
explicit
unique_lock
(
mutex_type
&
m
)
;
|
(3) | (depuis C++11) |
|
unique_lock
(
mutex_type
&
m,
std::
defer_lock_t
t
)
noexcept
;
|
(4) | (depuis C++11) |
|
unique_lock
(
mutex_type
&
m,
std::
try_to_lock_t
t
)
;
|
(5) | (depuis C++11) |
|
unique_lock
(
mutex_type
&
m,
std::
adopt_lock_t
t
)
;
|
(6) | (depuis C++11) |
|
template
<
class
Rep,
class
Period
>
unique_lock
(
mutex_type
&
m,
|
(7) | (depuis C++11) |
|
template
<
class
Clock,
class
Duration
>
unique_lock
(
mutex_type
&
m,
|
(8) | (depuis C++11) |
Construit un
unique_lock
, verrouillant optionnellement le mutex fourni.
1)
Construit un
unique_lock
sans mutex associé.
2)
Constructeur de déplacement. Initialise le
unique_lock
avec le contenu de
other
. Laisse
other
sans mutex associé.
3-8)
Construit un
unique_lock
avec
m
comme mutex associé. De plus :
3)
Verrouille le mutex associé en appelant
m.
lock
(
)
.
4)
Ne verrouille pas le mutex associé.
5)
Tente de verrouiller le mutex associé sans bloquer en appelant
m.
try_lock
(
)
. Le comportement est indéfini si
Mutex
ne satisfait pas
Lockable
.
6)
Suppose que le thread appelant détient déjà un verrou non partagé (c'est-à-dire un verrou acquis par
lock
,
try_lock
,
try_lock_for
, ou
try_lock_until
) sur
m
. Le comportement est indéfini si ce n'est pas le cas.
7)
Tente de verrouiller le mutex associé en appelant
m.
try_lock_for
(
timeout_duration
)
. Se bloque jusqu'à ce que la durée spécifiée
timeout_duration
se soit écoulée ou que le verrou soit acquis, selon la première éventualité. Peut se bloquer plus longtemps que
timeout_duration
. Le comportement est indéfini si
Mutex
ne satisfait pas
TimedLockable
.
8)
Tente de verrouiller le mutex associé en appelant
m.
try_lock_until
(
timeout_time
)
. Se bloque jusqu'à ce que le
timeout_time
spécifié soit atteint ou que le verrou soit acquis, selon la première éventualité. Peut se bloquer plus longtemps que jusqu'à ce que
timeout_time
soit atteint. Le comportement est indéfini si
Mutex
ne satisfait pas aux exigences de
TimedLockable
.
Paramètres
| other | - |
un autre
unique_lock
pour initialiser l'état
|
| m | - | mutex à associer au verrou et optionnellement en acquérir la propriété |
| t | - | paramètre de balise utilisé pour sélectionner les constructeurs avec différentes stratégies de verrouillage |
| timeout_duration | - | durée maximale de blocage |
| timeout_time | - | point temporel maximum jusqu'auquel bloquer |
Exemple
Exécuter ce code
#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() { { // Note : std::lock_guard ou atomic<int> peuvent être utilisés à la place std::unique_lock<std::mutex> lk(m_a); ++a; } { // Note : voir std::lock et std::scoped_lock pour les détails et alternatives 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 << "ème et " << a + 1 << "ème nombres de Fibonacci : " << b << " et " << c << '\n'; }
Sortie :
12ème et 13ème nombres de Fibonacci : 144 et 233