Standard library header <shared_mutex>

From cppreference.com
< cpp‎ | header

This header is part of the thread support library.

Classes

provides shared mutual exclusion facility
(class)
provides shared mutual exclusion facility
(class)
implements movable shared mutex ownership wrapper
(class template)

Functions

specialization of std::swap for shared_lock
(function template)

Synopsis

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;
}

Class std::shared_mutex

class shared_mutex {
 public:
    typedef /*implementation-defined*/ native_handle_type;
 
    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
    native_handle_type native_handle();
};

Class std::shared_timed_mutex

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();
};

Class std::shared_lock

template <class 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
};