std:: unique_lock
|
Défini dans l'en-tête
<mutex>
|
||
|
template
<
class
Mutex
>
class unique_lock ; |
(depuis C++11) | |
La classe
unique_lock
est un wrapper de propriété de mutex à usage général permettant le verrouillage différé, les tentatives de verrouillage avec contraintes temporelles, le verrouillage récursif, le transfert de propriété du verrou et l'utilisation avec des variables de condition.
La classe
unique_lock
est déplaçable, mais non copiable -- elle satisfait aux exigences de
MoveConstructible
et
MoveAssignable
mais pas celles de
CopyConstructible
ou
CopyAssignable
.
La classe
unique_lock
satisfait aux exigences
BasicLockable
. Si
Mutex
satisfait aux exigences
Lockable
,
unique_lock
satisfait également aux exigences
Lockable
(par exemple : peut être utilisé dans
std::lock
) ; si
Mutex
satisfait aux exigences
TimedLockable
,
unique_lock
satisfait également aux exigences
TimedLockable
.
Table des matières |
Paramètres du modèle
| Mutex | - | le type du mutex à verrouiller. Le type doit satisfaire aux BasicLockable exigences |
Types imbriqués
| Type | Définition |
mutex_type
|
Mutex
|
Fonctions membres
construit un
unique_lock
, verrouillant optionnellement (c'est-à-dire prenant la possession de) le mutex fourni
(fonction membre publique) |
|
|
déverrouille (c'est-à-dire libère la possession de) le mutex associé, s'il est possédé
(fonction membre publique) |
|
|
déverrouille (c'est-à-dire libère la possession de) le mutex, s'il est possédé, et acquiert la possession d'un autre
(fonction membre publique) |
|
Verrouillage |
|
|
verrouille (c'est-à-dire prend la possession de) le mutex associé
(fonction membre publique) |
|
|
tente de verrouiller (c'est-à-dire prend la possession de) le mutex associé sans bloquer
(fonction membre publique) |
|
|
tente de verrouiller (c'est-à-dire prend la possession de) le mutex
TimedLockable
associé, retourne si le mutex est resté indisponible pendant la durée spécifiée
(fonction membre publique) |
|
|
tente de verrouiller (c'est-à-dire prend la possession de) le mutex
TimedLockable
associé, retourne si le mutex est resté indisponible jusqu'à ce que le point temporel spécifié soit atteint
(fonction membre publique) |
|
|
déverrouille (c'est-à-dire libère la possession de) le mutex associé
(fonction membre publique) |
|
Modificateurs |
|
|
échange l'état avec un autre
std::unique_lock
(fonction membre publique) |
|
|
dissocie le mutex associé sans le déverrouiller (c'est-à-dire sans libérer sa possession)
(fonction membre publique) |
|
Observateurs |
|
|
retourne un pointeur vers le mutex associé
(fonction membre publique) |
|
|
teste si le verrou possède (c'est-à-dire a verrouillé) son mutex associé
(fonction membre publique) |
|
|
teste si le verrou possède (c'est-à-dire a verrouillé) son mutex associé
(fonction membre publique) |
|
Fonctions non membres
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
Notes
Une erreur courante chez les débutants est d'« oublier » de donner un nom à une variable
unique_lock
, par exemple
std
::
unique_lock
(
mtx
)
;
(qui construit par défaut une variable
unique_lock
nommée
mtx
) ou
std
::
unique_lock
{
mtx
}
;
(qui construit un objet prvalue immédiatement détruit), ne construisant ainsi pas réellement un verrou qui maintient un mutex pour le reste de la portée.
Exemple
#include <iostream> #include <mutex> #include <thread> struct Box { explicit Box(int num) : num_things{num} {} int num_things; std::mutex m; }; void transfer(Box& from, Box& to, int num) { // ne pas encore acquérir les verrous std::unique_lock lock1{from.m, std::defer_lock}; std::unique_lock lock2{to.m, std::defer_lock}; // verrouiller les deux unique_lock sans interblocage std::lock(lock1, lock2); from.num_things -= num; to.num_things += num; // les mutex “from.m” et “to.m” sont déverrouillés dans les destructeurs de unique_lock } int main() { Box acc1{100}; Box acc2{50}; std::thread t1{transfer, std::ref(acc1), std::ref(acc2), 10}; std::thread t2{transfer, std::ref(acc2), std::ref(acc1), 5}; t1.join(); t2.join(); std::cout << "acc1: " << acc1.num_things << "\n" "acc2: " << acc2.num_things << '\n'; }
Sortie :
acc1: 95 acc2: 55
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 2981 | C++17 |
un guide de déduction redondant de
unique_lock<Mutex>
était fourni
|
supprimé |
Voir aussi
|
(C++11)
|
verrouille les mutex spécifiés, bloque si l'un d'eux n'est pas disponible
(modèle de fonction) |
|
(C++11)
|
implémente un wrapper de propriété de mutex strictement basé sur la portée
(modèle de classe) |
|
(C++17)
|
wrapper RAII évitant les interblocages pour plusieurs mutex
(modèle de classe) |
|
(C++11)
|
fournit une fonction d'exclusion mutuelle de base
(classe) |