The class recursive_mutex provides a recursive mutex with exclusive ownership
semantics.
If one thread owns a recursive_mutex object, attempts by another
thread to acquire ownership of that object will fail (for try_lock()) or block
(for lock()) until the first thread has completely released ownership.
A thread that owns a recursive_mutex object may acquire additional levels of
ownership by calling lock() or try_lock() on that object.
It is
unspecified how many levels of ownership may be acquired by a single thread.
If a thread
has already acquired the maximum level of ownership for a recursive_mutex
object, additional calls to try_lock() fail, and additional calls to
lock() throw an exception of type system_error.
A thread
shall call unlock() once for each level of ownership acquired by calls to
lock() and try_lock().
Only when all levels of ownership have been
released may ownership be acquired by another thread.