33 Thread support library [thread]
namespace std {
template <class Mutex>
class unique_lock {
public:
using mutex_type = Mutex;
unique_lock() noexcept;
explicit unique_lock(mutex_type& m);
unique_lock(mutex_type& m, defer_lock_t) noexcept;
unique_lock(mutex_type& m, try_to_lock_t);
unique_lock(mutex_type& m, adopt_lock_t);
template <class Clock, class Duration>
unique_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time);
template <class Rep, class Period>
unique_lock(mutex_type& m, const chrono::duration<Rep, Period>& rel_time);
~unique_lock();
unique_lock(const unique_lock&) = delete;
unique_lock& operator=(const unique_lock&) = delete;
unique_lock(unique_lock&& u) noexcept;
unique_lock& operator=(unique_lock&& u);
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(unique_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> unique_lock(unique_lock<Mutex>) -> unique_lock<Mutex>;
template <class Mutex>
void swap(unique_lock<Mutex>& x, unique_lock<Mutex>& y) noexcept;
}
An object of type
unique_lock controls the ownership of a lockable
object within a scope
. Ownership of the lockable object may be acquired at
construction or after construction, and may be transferred, after
acquisition, to another
unique_lock object
. Objects of type
unique_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
unique_lock object
. [
Note: unique_lock<Mutex> meets the
BasicLockable requirements
. If
Mutex
meets the
Lockable requirements (
[thread.req.lockable.req]),
unique_lock<Mutex> also meets the
Lockable requirements;
if
Mutex
meets the
TimedLockable requirements (
[thread.req.lockable.timed]),
unique_lock<Mutex> also meets the
TimedLockable requirements
. —
end note ]
unique_lock() noexcept;
Effects: Constructs an object of type
unique_lock. Postconditions: pm == 0 and
owns == false. explicit unique_lock(mutex_type& m);
Requires: If
mutex_type is not a recursive mutex the calling thread does not own the mutex
. Effects: Constructs an object of type
unique_lock and calls
m.lock(). Postconditions: pm == addressof(m) and
owns == true. unique_lock(mutex_type& m, defer_lock_t) noexcept;
Effects: Constructs an object of type
unique_lock. Postconditions: pm == addressof(m) and
owns == false. unique_lock(mutex_type& m, try_to_lock_t);
If
mutex_type is not a recursive mutex the calling thread does not own the mutex
. Effects: Constructs an object of type
unique_lock and calls
m.try_lock(). Postconditions: pm == addressof(m) and
owns == res,
where
res is the value returned by the call to
m.try_lock(). unique_lock(mutex_type& m, adopt_lock_t);
Requires: The calling thread owns the mutex
. Effects: Constructs an object of type
unique_lock. Postconditions: pm == addressof(m) and
owns == true. template <class Clock, class Duration>
unique_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time);
Requires: If
mutex_type is not a recursive mutex the calling thread
does not own the mutex
. Effects: Constructs an object of type
unique_lock and calls
m.try_lock_until(abs_time). Postconditions: pm == addressof(m) and
owns == res,
where
res is
the value returned by the call to
m.try_lock_until(abs_time). template <class Rep, class Period>
unique_lock(mutex_type& m, const chrono::duration<Rep, Period>& rel_time);
Requires: If
mutex_type is not a recursive mutex the calling thread does not own the mutex
. Effects: Constructs an object of type
unique_lock and calls
m.try_lock_for(rel_time). Postconditions: pm == addressof(m) and
owns == res,
where
res is the value returned by the call to
m.try_lock_for(rel_time). unique_lock(unique_lock&& u) noexcept;
Postconditions: pm == u_p.pm and
owns == u_p.owns (where
u_p is the state of
u just prior to this construction),
u.pm == 0 and
u.owns == false. unique_lock& operator=(unique_lock&& u);
Effects: If
owns calls
pm->unlock(). Postconditions: pm == u_p.pm and
owns == u_p.owns (where
u_p is the state of
u just prior to this construction),
u.pm == 0 and
u.owns == false. [
Note: With a recursive mutex it is possible for both
*this and
u to own the same mutex before the assignment
. In this case,
*this will own the mutex after the assignment and
u will not
. —
end note ]
~unique_lock();
Effects: If
owns calls
pm->unlock(). void lock();
Effects: As if by
pm->lock(). Postconditions: owns == true. Throws:
Any exception thrown by
pm->lock(). Error conditions:
operation_not_permitted — if
pm is
nullptr. resource_deadlock_would_occur — if on entry
owns
is
true.
bool try_lock();
Effects: As if by
pm->try_lock(). Returns: The value returned by the call to
try_lock(). Postconditions: owns == res, where
res is the value returned by
the call to
try_lock(). Throws:
Any exception thrown by
pm->try_lock(). Error conditions:
operation_not_permitted — if
pm is
nullptr. resource_deadlock_would_occur — if on entry
owns
is
true.
template <class Clock, class Duration>
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
Effects: As if by
pm->try_lock_until(abs_time). Returns: The value returned by the call to
try_lock_until(abs_time). Postconditions: owns == res, where
res is the value returned by
the call to
try_lock_until(abs_time). Throws: Any exception thrown by
pm->try_lock_until(). Error conditions:
operation_not_permitted — if
pm is
nullptr. resource_deadlock_would_occur — if on entry
owns is
true.
template <class Rep, class Period>
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
Effects: As if by
pm->try_lock_for(rel_time). Returns: The value returned by the call to
try_lock_until(rel_time). Postconditions: owns == res, where
res is the value returned by the call to
try_lock_for(rel_time). Throws: Any exception thrown by
pm->try_lock_for(). Error conditions:
operation_not_permitted — if
pm is
nullptr. resource_deadlock_would_occur — if on entry
owns is
true.
void unlock();
Effects: As if by
pm->unlock(). Postconditions: owns == false. Error conditions:
operation_not_permitted — if on entry
owns is
false.
void swap(unique_lock& u) noexcept;
Effects: Swaps the data members of
*this and
u. mutex_type* release() noexcept;
Returns: The previous value of
pm. Postconditions: pm == 0 and
owns == false. template <class Mutex>
void swap(unique_lock<Mutex>& x, unique_lock<Mutex>& y) noexcept;
Effects: As if by
x.swap(y). bool owns_lock() const noexcept;
explicit operator bool() const noexcept;
mutex_type *mutex() const noexcept;