namespace std {
template<class Mutex>
class shared_lock {
public:
using mutex_type = Mutex;
shared_lock() noexcept;
explicit shared_lock(mutex_type& m);
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(const shared_lock&) = delete;
shared_lock& operator=(const shared_lock&) = delete;
shared_lock(shared_lock&& u) noexcept;
shared_lock& operator=(shared_lock&& u) noexcept;
void lock();
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();
void swap(shared_lock& u) noexcept;
mutex_type* release() noexcept;
bool owns_lock() const noexcept;
explicit operator bool () const noexcept;
mutex_type* mutex() const noexcept;
private:
mutex_type* pm;
bool owns;
};
template<class Mutex>
void swap(shared_lock<Mutex>& x, shared_lock<Mutex>& y) noexcept;
}
An object of type
shared_lock controls the shared ownership of a
lockable object within a scope
. Shared ownership of the lockable object may be
acquired at construction or after construction, and may be transferred, after
acquisition, to another
shared_lock object
. Objects of type
shared_lock are not copyable but are movable
. The behavior of a program
is undefined if the contained pointer
pm is not null and the lockable
object pointed to by
pm does not exist for the entire remaining
lifetime (
[basic.life]) of the
shared_lock object
.