[thread.mutex.requirements.general]

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

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

### 32.6.4 Mutex requirements [[thread.mutex.requirements]](thread.mutex.requirements#general)

#### 32.6.4.1 General [thread.mutex.requirements.general]

[1](#1)

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

A mutex object facilitates protection against data races and allows safe synchronization of
data between [execution agents](thread.req.lockable#def:execution_agent "32.2.5 Requirements for Cpp17Lockable types [thread.req.lockable]")[.](#1.sentence-1)

An execution agent [*owns*](#def:owns) a mutex from the time it successfully calls one of the
lock functions until it calls unlock[.](#1.sentence-2)

Mutexes can be either recursive or non-recursive, and can
grant simultaneous ownership to one or many execution agents[.](#1.sentence-3)

Both
recursive and non-recursive mutexes are supplied[.](#1.sentence-4)
