<shared_mutex>
L’en-tête <shared_mutex>
fournit des primitives de synchronisation pour la protection des données partagées accessibles par plusieurs threads. En plus du contrôle d’accès exclusif fourni par les classes mutex, les classes mutex partagé prennent en charge la propriété partagée par plusieurs threads pour permettre un accès non exclusif. Les mutex partagés s’utilisent pour contrôler les ressources qui peuvent être lues par plusieurs threads sans provoquer de condition critique, mais qui doivent être écrites en mode exclusif par un seul thread.
L’en-tête <shared_mutex>
définit les classes shared_mutex
et shared_timed_mutex
, le modèle shared_lock
de classe, et la fonction swap
de modèle pour la prise en charge de mutex partagé.
Classes | Description |
---|---|
shared_mutex, classe | Type de mutex partagé qui peut être verrouillé en mode exclusif par un seul agent ou être partagé en mode non exclusif par plusieurs agents. |
shared_timed_mutex, classe | Type de mutex temporisé partagé qui peut être verrouillé en mode exclusif par un seul agent ou être partagé en mode non exclusif par plusieurs agents. |
shared_lock, classe | Modèle de classe qui encapsule un mutex partagé pour prendre en charge les opérations de verrouillage chronométrées et le partage non exclusif par plusieurs agents. |
Fonctions | Description |
---|---|
swap | Échange le contenu des objets mutex partagé qui sont référencés par les paramètres de la fonction. |
Syntaxe
namespace std {
class shared_mutex;
class shared_timed_mutex;
template <class Mutex>
class shared_lock;
template <class Mutex>
void swap(shared_lock<Mutex>& x, shared_lock<Mutex>& y) noexcept;
}
Notes
Une instance de la classe shared_mutex
est du type mutex partagé, qui est un type utilisé pour contrôler la propriété partagée d’un mutex dans une portée. Le type mutex partagé présente toutes les conditions du type mutex, ainsi que les membres pour prendre en charge la propriété non exclusive partagée.
Le type mutex partagé prend en charge les méthodes supplémentaires lock_shared
, unlock_shared
et try_lock_shared
:
La méthode
lock_shared
bloque le thread appelant jusqu’à ce que le thread obtienne la propriété partagée du mutex.La méthode
unlock_shared
libère la propriété partagée du mutex détenu par le thread appelant.La méthode
try_lock_shared
tente d’obtenir la propriété partagée du mutex sans bloquer le thread. Son type de retour est convertible enbool
et correspond àtrue
si la méthode obtient la propriété. Sinon, il correspond àfalse
.
La classe shared_timed_mutex
est du type mutex temporisé partagé. Ce type remplit les conditions à la fois du type mutex partagé et du type mutex temporisé.
Le type mutex temporisé partagé prend en charge les méthodes supplémentaires try_lock_shared_for
et try_lock_shared_until
:
La méthode
try_lock_shared_for
tente d’obtenir la propriété partagée du mutex jusqu’à ce que la durée spécifiée par le paramètre soit écoulée. Si la durée n’est pas positive, la méthode est équivalente àtry_lock_shared
. La méthode ne retourne pas de valeur dans la durée spécifiée, sauf si elle obtient la propriété partagée. Sa valeur de retour esttrue
si la méthode obtient la propriété. Sinon, sa valeur estfalse
.La méthode
try_lock_shared_until
tente d’obtenir la propriété partagée du mutex jusqu’à ce que le temps absolu spécifié soit écoulé. Si le temps spécifié est écoulé, la méthode est équivalente àtry_lock_shared
. La méthode ne retourne pas de valeur avant le temps spécifié, sauf si elle obtient la propriété partagée. Sa valeur de retour esttrue
si la méthode obtient la propriété. Sinon, sa valeur estfalse
.
Le shared_lock
modèle de classe étend la prise en charge du verrouillage chronométré et du transfert de propriété vers un mutex partagé. La propriété du mutex peut être obtenue au moment ou après la construction, et être transférée à un autre objet shared_lock
. Les objets de type shared_lock
peuvent être déplacés, mais pas copiés.
Avertissement
À compter de Visual Studio 2015, les types de synchronisation de bibliothèque standard C++ sont basés sur des primitives de synchronisation Windows et n’utilisent plus ConcRT (sauf lorsque la plateforme cible est Windows XP). Les types définis dans <shared_mutex>
ne doivent pas être utilisés avec des types ou fonctions ConcRT.
Classes
shared_mutex, classe
La classe shared_mutex
implémente un mutex non récursif avec une sémantique de propriété partagée.
class shared_mutex {
public:
shared_mutex();
~shared_mutex();
shared_mutex(const shared_mutex&) = delete;
shared_mutex& operator=(const shared_mutex&) = delete;
// Exclusive ownership
void lock();
// blocking
bool try_lock();
void unlock();
// Shared ownership
void lock_shared();
// blocking
bool try_lock_shared();
void unlock_shared();
// Getters
typedef void** native_handle_type; // implementation defined
native_handle_type native_handle();
};
shared_timed_mutex, classe
La classe shared_timed_mutex
implémente un mutex non récursif avec une sémantique de propriété partagée qui remplit les conditions du type mutex temporisé.
class shared_timed_mutex {
public:
shared_timed_mutex();
~shared_timed_mutex();
shared_timed_mutex(const shared_timed_mutex&) = delete;
shared_timed_mutex& operator=(const shared_timed_mutex&) = delete;
// Exclusive ownership
void lock();
// blocking
bool try_lock();
template <class Rep, class Period>
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
template <class Clock, class Duration>
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
void unlock();
// Shared ownership
void lock_shared();
// blocking
bool try_lock_shared();
template <class Rep, class Period>
bool try_lock_shared_for(const chrono::duration<Rep, Period>& rel_time);
template <class Clock, class Duration>
bool try_lock_shared_until(const chrono::time_point<Clock, Duration>& abs_time);
void unlock_shared();
};
shared_lock, classe
Le modèle shared_lock
de classe contrôle la propriété partagée d’un objet mutex partagé dans une étendue. Le paramètre de modèle doit être un type mutex partagé.
class shared_lock {
public:
typedef Mutex mutex_type;
shared_lock() noexcept;
explicit shared_lock(mutex_type& m);
// blocking
shared_lock(mutex_type& m, defer_lock_t) noexcept;
shared_lock(mutex_type& m, try_to_lock_t);
shared_lock(mutex_type& m, adopt_lock_t);
template <class Clock, class Duration>
shared_lock(mutex_type& m,
const chrono::time_point<Clock, Duration>& abs_time);
template <class Rep, class Period>
shared_lock(mutex_type& m,
const chrono::duration<Rep, Period>& rel_time);
~shared_lock();
shared_lock(shared_lock const&) = delete;
shared_lock& operator=(shared_lock const&) = delete;
shared_lock(shared_lock&& u) noexcept;
shared_lock& operator=(shared_lock&& u) noexcept;
void lock();
// blocking
bool try_lock();
template <class Rep, class Period>
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
template <class Clock, class Duration>
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
void unlock();
// Setters
void swap(shared_lock& u) noexcept;
mutex_type* release() noexcept;
// Getters
bool owns_lock() const noexcept;
explicit operator bool () const noexcept;
mutex_type* mutex() const noexcept;
private:
mutex_type* pm; // exposition only
bool owns; // exposition only
};
Functions
swap
Échange les objets shared_lock
.
template <class Mutex>
void swap(shared_lock<Mutex>& x, shared_lock<Mutex>& y) noexcept;
Échange le contenu de deux objets shared_lock
. Fonctionne comme x.swap(y)
.
Spécifications
Header :<shared_mutex>
Espace de noms : std
Voir aussi
Informations de référence sur les fichiers d’en-tête
<mutex>