[intro.multithread.general]

# 6 Basics [[basic]](./#basic)

## 6.10 Program execution [[basic.exec]](basic.exec#intro.multithread.general)

### 6.10.2 Multi-threaded executions and data races [[intro.multithread]](intro.multithread#general)

#### 6.10.2.1 General [intro.multithread.general]

[1](#1)

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

A [*thread of execution*](#def:thread_of_execution "6.10.2.1 General [intro.multithread.general]") (also known as a [*thread*](#def:thread "6.10.2.1 General [intro.multithread.general]")) is a single flow of
control within a program, including the initial invocation of a specific
top-level function, and recursively including every function invocation
subsequently executed by the thread[.](#1.sentence-1)

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

When one thread creates another,
the initial call to the top-level function of the new thread is executed by the
new thread, not by the creating thread[.](#1.sentence-2)

â *end note*]

Every thread in a program can
potentially use every object and function in a program[.](#1.sentence-3)[37](#footnote-37 "An object with automatic or thread storage duration ([basic.stc]) is associated with one specific thread, and can be accessed by a different thread only indirectly through a pointer or reference ([basic.compound]).")

Under a hosted
implementation, a C++ program can have more than one thread running
concurrently[.](#1.sentence-4)

The execution of each thread proceeds as defined by the remainder
of this document[.](#1.sentence-5)

The execution of the entire program consists of an execution
of all of its threads[.](#1.sentence-6)

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

Usually the execution can be viewed as an
interleaving of all its threads[.](#1.sentence-7)

However, some kinds of atomic operations, for
example, allow executions inconsistent with a simple interleaving, as described
below[.](#1.sentence-8)

â *end note*]

Under a freestanding implementation, it is implementation-defined whether a program can
have more than one thread of execution[.](#1.sentence-9)

[2](#2)

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

For a signal handler that is not executed as a result of a call to thestd​::​raise function, it is unspecified which thread of execution
contains the signal handler invocation[.](#2.sentence-1)

[37)](#footnote-37)[37)](#footnoteref-37)

An object
with automatic or thread storage duration ([[basic.stc]](basic.stc "6.8.6 Storage duration")) is associated with
one specific thread, and can be accessed by a different thread only indirectly
through a pointer or reference ([[basic.compound]](basic.compound "6.9.4 Compound types"))[.](#footnote-37.sentence-1)
