Some lockable objects are “agent oblivious” in that they work for any
execution agent model because they do not determine or store the agent's ID (e.g., an
ordinary spin lock).
The Cpp17BasicLockable requirements, the Cpp17Lockable requirements,
and the Cpp17TimedLockable requirements list the requirements imposed by these library types
in order to acquire or release ownership of a lock by a given execution agent.
A type L meets the Cpp17BasicLockable requirements if the following expressions are
well-formed and have the specified semantics (m denotes a value of type L).
A type L meets the Cpp17Lockable requirements if it meets the Cpp17BasicLockable
requirements and the following expressions are well-formed and have the specified semantics
(m denotes a value of type L).
A type L meets the Cpp17TimedLockable requirements if it meets the Cpp17Lockable
requirements and the following expressions are well-formed and have the specified semantics
(m denotes a value of type L, rel_time denotes a value of an
instantiation of duration, and abs_time denotes a value
of an instantiation of time_point).