32
Concurrency support library
[thread]
32.2
Requirements
[thread.req]
32.2.5
Requirements for
Cpp17Lockable
types
[thread.req.lockable]
32.2.5.1
General
[thread.req.lockable.general]
1
#
An
execution agent
is an entity such as a thread that may perform work in parallel with other execution agents
.
[
Note
1
:
Implementations or users can introduce other kinds of agents such as processes or thread-pool tasks
.
—
end note
]
The calling agent is determined by context, e.g., the calling thread that contains the call, and so on
.
2
#
[
Note
2
:
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)
.
—
end note
]
3
#
The standard library templates
unique_
lock
(
[thread.
lock.
unique]
),
shared_
lock
(
[thread.
lock.
shared]
),
scoped_
lock
(
[thread.
lock.
scoped]
),
lock_
guard
(
[thread.
lock.
guard]
),
lock
,
try_
lock
(
[thread.
lock.
algorithm]
), and
condition_
variable_
any
(
[thread.
condition.
condvarany]
) all operate on user-supplied lockable objects
.
The
Cpp17BasicLockable
requirements, the
Cpp17Lockable
requirements, the
Cpp17TimedLockable
requirements, the
Cpp17SharedLockable
requirements, and the
Cpp17SharedTimedLockable
requirements list the requirements imposed by these library types in order to acquire or release ownership of a
lock
by a given execution agent
.
[
Note
3
:
The nature of any lock ownership and any synchronization it entails are not part of these requirements
.
—
end note
]
4
#
A lock on an object
m
is said to be
(4.1)
a
non-shared lock
if it is acquired by a call to
lock
,
try_
lock
,
try_
lock_
for
, or
try_
lock_
until
on
m
, or
(4.2)
a
shared lock
if it is acquired by a call to
lock_
shared
,
try_
lock_
shared
,
try_
lock_
shared_
for
, or
try_
lock_
shared_
until
on
m
.
[
Note
4
:
Only the method of lock acquisition is considered; the nature of any lock ownership is not part of these definitions
.
—
end note
]