C++ named requirements: Mutex (since C++11)
From cppreference.net
Les Mutex exigences étendent les Lockable exigences pour inclure la synchronisation inter-threads.
Table des matières |
Exigences
- Lockable
- DefaultConstructible
- Destructible
- non copiable
- non déplaçable
Pour un objet
m
de type
Mutex
:
- L'expression m. lock ( ) possède les propriétés suivantes
-
- Se comporte comme une opération atomique.
- Bloque le thread appelant jusqu'à ce que la propriété exclusive du mutex puisse être obtenue.
- Les opérations m. unlock ( ) antérieures sur le même mutex synchronize-with cette opération de verrouillage (équivalent à release-acquire std::memory_order ).
- Le comportement est indéfini si le thread appelant possède déjà le mutex (sauf si m est std::recursive_mutex ou std::recursive_timed_mutex ).
- Une exception de type std::system_error peut être levée en cas d'erreurs, avec les codes d'erreur suivants :
-
- std::errc::operation_not_permitted si le thread appelant n'a pas les privilèges requis.
- std::errc::resource_deadlock_would_occur si l'implémentation détecte que cette opération conduirait à un interblocage.
- L'expression m. try_lock ( ) possède les propriétés suivantes
-
- Se comporte comme une opération atomique.
- Tente d'obtenir la propriété exclusive du mutex pour le thread appelant sans bloquer. Si la propriété n'est pas obtenue, retourne immédiatement. La fonction est autorisée à échouer de manière sporadique et à retourner même si le mutex n'est pas actuellement détenu par un autre thread.
-
Si
try_lock()réussit, les opérationsunlock()antérieures sur le même objet synchronize-with cette opération (équivalent à release-acquire std::memory_order ).lock()ne se synchronise pas avec un échec detry_lock(). - Ne lève pas d'exceptions.
- L'expression m. unlock ( ) possède les propriétés suivantes
-
- Se comporte comme une opération atomique.
- Libère la propriété du mutex par le thread appelant et synchronizes-with les opérations de verrouillage ultérieures réussies sur le même objet.
- Le comportement est indéfini si le thread appelant ne possède pas le mutex.
- Ne lève pas d'exceptions.
- Toutes les opérations de verrouillage et de déverrouillage sur un mutex unique se produisent dans un ordre total unique qui peut être considéré comme l'ordre de modification d'une variable atomique : l'ordre est spécifique à ce mutex individuel.
Bibliothèque standard
Les types suivants de la bibliothèque standard satisfont les exigences Mutex :
|
(C++11)
|
fournit une fonction d'exclusion mutuelle de base
(classe) |
|
(C++11)
|
fournit une fonction d'exclusion mutuelle pouvant être verrouillée récursivement par le même thread
(classe) |
|
(C++11)
|
fournit une fonction d'exclusion mutuelle pouvant être verrouillée récursivement
par le même thread et implémente le verrouillage avec un délai d'expiration (classe) |
|
(C++17)
|
fournit une fonction d'exclusion mutuelle partagée
(classe) |
|
(C++14)
|
fournit une fonction d'exclusion mutuelle partagée et implémente le verrouillage avec un délai d'expiration
(classe) |
|
(C++11)
|
fournit une fonction d'exclusion mutuelle qui implémente le verrouillage avec un délai d'expiration
(classe) |
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 2309 | C++11 |
lock
pourrait lever
std::system_error
avec le code d'erreur std::errc::device_or_resource_busy |
non autorisé |