C++ named requirements: TimedMutex (since C++11)
From cppreference.com
The TimedMutex requirements extend the TimedLockable requirements to include inter-thread synchronization.
Requirements
Additionally, for an object m of TimedMutex type:
- The expression m.try_lock_for(duration) has the following properties
- Behaves as an atomic operation.
- Attempts to obtain exclusive ownership of the mutex within the duration specified by
duration. Ifdurationis less or equalduration.zero(), attempts to obtain the ownership without blocking (as if bytry_lock()). Otherwise, this function blocks until the mutex is acquired or until the time specified bydurationpasses. It returns withindurationonly if it succeeds, but it is allowed to fail to acquire the mutex even if at some point in time duringdurationit was not owned by another thread. In any case, it returns true if the mutex was acquired and false otherwise. - If
try_lock_for(duration)succeeds, priorunlock()operations on the same object synchronize-with this operation (equivalent to release-acquire std::memory_order). - The behavior is undefined if the calling thread already owns the mutex (except if m is std::recursive_timed_mutex).
- An exception may be thrown by clock, time point, or duration during the execution (clocks, time points, and durations provided by the standard library never throw).
- The expression m.try_lock_until(time_point) has the following properties
- Behaves as an atomic operation.
- Attempts to obtain exclusive ownership of the mutex within the time left until
time_point. Iftime_pointalready passed, attempts to obtain the ownership without blocking (as if bytry_lock()). Otherwise, this function blocks until the mutex is acquired or until the time specified bytime_pointpasses. It returns beforetime_pointonly if it succeeds, but it is allowed to fail to acquire the mutex even if at some point in time beforetime_pointit was not owned by another thread. In any case, it returns true if the mutex was acquired and false otherwise. - If
try_lock_until(time_point)succeeds, priorunlock()operations on the same object synchronize-with this operation (equivalent to release-acquire std::memory_order). - The behavior is undefined if the calling thread already owns the mutex (except if m is std::recursive_timed_mutex).
- An exception may be thrown by clock, time point, or duration during the execution (clocks, time points, and durations provided by the standard library never throw).
Standard library
The following standard library types satisfy TimedMutex requirements:
| (C++11) |
provides mutual exclusion facility which can be locked recursively by the same thread and implements locking with a timeout (class) |
| (C++14) |
provides shared mutual exclusion facility and implements locking with a timeout (class) |
| (C++11) |
provides mutual exclusion facility which implements locking with a timeout (class) |
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2093 | C++11 | timeout-related exceptions were missing in the specification | mentioned |