<shared_mutex>
Nagłówek <shared_mutex>
zawiera typy pierwotne synchronizacji na potrzeby ochrony udostępnionych danych, do których można uzyskać dostęp przez wiele wątków. Oprócz wyłącznej kontroli dostępu zapewnianej przez klasy mutex współużytkowane klasy mutex umożliwiają również współdzielenie własności przez wiele wątków na potrzeby dostępu bez wyłącznych. Udostępnione mutexy mogą służyć do kontrolowania zasobów, które mogą być odczytywane przez kilka wątków bez powodowania stanu wyścigu, ale muszą być zapisywane wyłącznie przez jeden wątek.
Nagłówek <shared_mutex>
definiuje klasy shared_mutex
i shared_timed_mutex
, szablon shared_lock
klasy i funkcję swap
szablonu dla współużytkowanej obsługi mutex.
Klasy | opis |
---|---|
klasa shared_mutex | Współużytkowany typ mutexu, który może być zablokowany wyłącznie przez jednego agenta lub współużytkowany przez wielu agentów. |
klasa shared_timed_mutex | Udostępniony typ mutexu czasowego, który może być zablokowany wyłącznie przez jednego agenta lub udostępniony nie wyłącznie przez wielu agentów. |
klasa shared_lock | Szablon klasy, który opakowuje udostępniony mutex w celu obsługi operacji blokady czasowej i udostępniania bez wyłącznych przez wielu agentów. |
Funkcje | opis |
---|---|
zamiana | Zamienia zawartość udostępnionych obiektów mutex, do których odwołuje się parametr funkcji. |
Składnia
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;
}
Uwagi
Wystąpienie klasy shared_mutex
jest typem współużytkowanego mutexu, który kontroluje współdzieloną własność mutexu w zakresie. Współużytkowany typ mutex spełnia wszystkie wymagania typu mutex, a także elementy członkowskie do obsługi współużytkowanej własności bez wyłączności.
Współużytkowany typ mutex obsługuje dodatkowe metody lock_shared
, unlock_shared
i try_lock_shared
:
Metoda
lock_shared
blokuje wątek wywołujący, dopóki wątek nie uzyska współużytkowanej własności mutexu.Metoda
unlock_shared
zwalnia współwłasność mutexu przechowywanego przez wątek wywołujący.Metoda
try_lock_shared
próbuje uzyskać współdzieloną własność mutexu bez blokowania. Jego zwracany typ jest konwertowany nabool
i jesttrue
, jeśli metoda uzyskuje własność, ale w przeciwnym raziefalse
.
Klasa shared_timed_mutex
jest współużytkowanym typem mutex czasowym, typem spełniającym wymagania zarówno typu współużytkowanego mutexu, jak i typu czasowego mutexu.
Udostępniony typ mutexu czasowego obsługuje dodatkowe metody try_lock_shared_for
i try_lock_shared_until
:
Metoda
try_lock_shared_for
próbuje uzyskać współdzieloną własność mutexu, dopóki czas trwania określony przez parametr nie zostanie przekazany. Jeśli czas trwania nie jest dodatni, metoda jest równoważna .try_lock_shared
Metoda nie zwraca się w określonym czasie trwania, chyba że zostanie uzyskana własność współdzielona. Jego wartość zwracana jesttrue
wtedy, gdy metoda uzyskuje własność, ale w przeciwnym raziefalse
jest .Metoda
try_lock_shared_until
próbuje uzyskać współdzieloną własność mutexu, dopóki nie upłynął określony czas bezwzględny. Jeśli określony czas został już przekazany, metoda jest równoważna metodzietry_lock_shared
. Metoda nie zwraca się przed określonym czasem, chyba że zostanie uzyskana własność współdzielona. Jego wartość zwracana jesttrue
wtedy, gdy metoda uzyskuje własność, ale w przeciwnym raziefalse
jest .
Szablon shared_lock
klasy rozszerza obsługę czasowego blokowania i przenoszenia własności do udostępnionego mutexu. Własność mutexu można uzyskać w lub po budowie i może zostać przeniesiona do innego shared_lock
obiektu. Obiekty typu shared_lock
można przenosić, ale nie kopiowane.
Ostrzeżenie
Począwszy od programu Visual Studio 2015, typy synchronizacji biblioteki standardowej języka C++ są oparte na typach pierwotnych synchronizacji systemu Windows i nie używają już narzędzia ConcRT (z wyjątkiem sytuacji, gdy platforma docelowa to Windows XP). Typy zdefiniowane w programie <shared_mutex>
nie powinny być używane z żadnymi typami lub funkcjami ConcRT.
Klasy
klasa shared_mutex
Klasa shared_mutex
implementuje niecykliczny mutex z semantyka współdzieloną własnością.
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();
};
klasa shared_timed_mutex
Klasa shared_timed_mutex
implementuje niecykliczny mutex z semantyki współużytkowanej własności, która spełnia wymagania typu czasowego mutexu.
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();
};
klasa shared_lock
Szablon shared_lock
klasy kontroluje współdzieloną własność współużytkowanego obiektu mutex w zakresie. Parametr szablonu musi być udostępnionym typem mutex.
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
};
Funkcje
swap
shared_lock
Zamienia obiekty.
template <class Mutex>
void swap(shared_lock<Mutex>& x, shared_lock<Mutex>& y) noexcept;
Wymienia zawartość dwóch shared_lock
obiektów. Skutecznie tak samo jak x.swap(y)
.
Wymagania
Nagłówek:<shared_mutex>
Przestrzeń nazw: std