[thread.lock.general]

# 32 Concurrency support library [[thread]](./#thread)

## 32.6 Mutual exclusion [[thread.mutex]](thread.mutex#thread.lock.general)

### 32.6.5 Locks [[thread.lock]](thread.lock#general)

#### 32.6.5.1 General [thread.lock.general]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L8144)

A [*lock*](#def:lock) is an object that holds a reference to a lockable object and may unlock the
lockable object during the lock's destruction (such as when leaving block scope)[.](#1.sentence-1)

An execution
agent may use a lock to aid in managing ownership of a lockable object in an exception safe
manner[.](#1.sentence-2)

A lock is said to [*own*](#def:own) a lockable object if it is currently managing the
ownership of that lockable object for an execution agent[.](#1.sentence-3)

A lock does not manage the lifetime
of the lockable object it references[.](#1.sentence-4)

[*Note [1](#note-1)*:

Locks are intended to ease the burden of
unlocking the lockable object under both normal and exceptional circumstances[.](#1.sentence-5)

â *end note*]

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L8156)

Some lock constructors take tag types which describe what should be done with the lockable
object during the lock's construction[.](#2.sentence-1)

[ð](#lib:defer_lock_t)

namespace std {struct defer_lock_t { }; // do not acquire ownership of the mutexstruct try_to_lock_t { }; // try to acquire ownership of the mutex// without blockingstruct adopt_lock_t { }; // assume the calling thread has already// obtained mutex ownership and manage itinline constexpr defer_lock_t defer_lock { }; inline constexpr try_to_lock_t try_to_lock { }; inline constexpr adopt_lock_t adopt_lock { };}
