std:: shared_timed_mutex
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Exclusive locking | ||||
| Shared locking | ||||
|
Défini dans l'en-tête
<shared_mutex>
|
||
|
class
shared_timed_mutex
;
|
(depuis C++14) | |
La classe
shared_timed_mutex
est un primitif de synchronisation qui peut être utilisé pour protéger des données partagées contre un accès simultané par plusieurs threads. Contrairement aux autres types de mutex qui facilitent l'accès exclusif, un
shared_timed_mutex
possède deux niveaux d'accès :
- exclusive - un seul thread peut posséder le mutex.
- shared - plusieurs threads peuvent partager la propriété du même mutex.
Les mutex partagés sont généralement utilisés dans des situations où plusieurs lecteurs peuvent accéder à la même ressource simultanément sans provoquer de courses aux données, mais un seul rédacteur peut le faire.
D'une manière similaire à
timed_mutex
,
shared_timed_mutex
offre la possibilité de tenter de revendiquer la propriété d'un
shared_timed_mutex
avec un délai d'attente via les fonctions membres
try_lock_for()
,
try_lock_until()
,
try_lock_shared_for()
,
try_lock_shared_until()
.
La classe
shared_timed_mutex
satisfait toutes les exigences de
SharedTimedMutex
et de
StandardLayoutType
.
Table des matières |
Fonctions membres
|
construit le mutex
(fonction membre publique) |
|
|
détruit le mutex
(fonction membre publique) |
|
|
operator=
[deleted]
|
non assignable par copie
(fonction membre publique) |
Verrouillage exclusif |
|
|
verrouille le mutex, bloque si le mutex n'est pas disponible
(fonction membre publique) |
|
|
tente de verrouiller le mutex, retourne si le mutex n'est pas disponible
(fonction membre publique) |
|
|
tente de verrouiller le mutex, retourne si le mutex est resté
indisponible pendant la durée de timeout spécifiée (fonction membre publique) |
|
|
tente de verrouiller le mutex, retourne si le mutex est resté
indisponible jusqu'à ce que le point temporel spécifié soit atteint (fonction membre publique) |
|
|
déverrouille le mutex
(fonction membre publique) |
|
Verrouillage partagé |
|
|
verrouille le mutex en propriété partagée, bloque si le mutex n'est pas disponible
(fonction membre publique) |
|
|
tente de verrouiller le mutex en propriété partagée, retourne si le mutex n'est pas disponible
(fonction membre publique) |
|
|
tente de verrouiller le mutex en propriété partagée, retourne si le mutex est resté
indisponible pendant la durée de timeout spécifiée (fonction membre publique) |
|
|
tente de verrouiller le mutex en propriété partagée, retourne si le mutex est resté
indisponible jusqu'à ce que le point temporel spécifié soit atteint (fonction membre publique) |
|
|
déverrouille le mutex (propriété partagée)
(fonction membre publique) |
|
Notes
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_shared_timed_mutex
|
201402L
|
(C++14) |
std::shared_timed_mutex
|
Exemple
|
Cette section est incomplète
Raison : construire un exemple motivant |
Un opérateur d'affectation par copie pour une classe qui détient des ressources pouvant gérer plusieurs lecteurs, mais un seul écrivain.
#include <mutex> #include <shared_mutex> class R { mutable std::shared_timed_mutex mut; /* data */ public: R& operator=(const R& other) { // requires exclusive ownership to write to *this std::unique_lock<std::shared_timed_mutex> lhs(mut, std::defer_lock); // requires shared ownership to read from other std::shared_lock<std::shared_timed_mutex> rhs(other.mut, std::defer_lock); std::lock(lhs, rhs); /* assign data */ return *this; } }; int main() { R r; }