45 lines
1.8 KiB
Markdown
45 lines
1.8 KiB
Markdown
[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 { };}
|