32 Thread support library [thread]

32.4 Threads [thread.threads]

32.4.2 Class thread [thread.thread.class] Constructors [thread.thread.constr]

thread() noexcept;
Effects: Constructs a thread object that does not represent a thread of execution.
Ensures: get_­id() == id().
template<class F, class... Args> explicit thread(F&& f, Args&&... args);
Requires:  F and each in Args shall meet the Cpp17MoveConstructible requirements.
INVOKE(decay-copy(std​::​forward<F>(f)),decay-copy(std​::​forward<Args>(args))...) ([func.require]) shall be a valid expression.
Remarks: This constructor shall not participate in overload resolution if remove_­cvref_­t<F> is the same type as std​::​thread.
Effects:  Constructs an object of type thread.
The new thread of execution executes INVOKE(decay-copy(​std​::​forward<F>(f)), decay-copy(​std​::​forward<Args>(​args))...) with the calls to decay-copy being evaluated in the constructing thread.
Any return value from this invocation is ignored.
This implies that any exceptions not thrown from the invocation of the copy of f will be thrown in the constructing thread, not the new thread.
— end note
If the invocation of INVOKE(decay-copy(​std​::​forward<F>(f)), decay-copy(​std​::​forward<Args>(args))...) terminates with an uncaught exception, terminate shall be called.
Synchronization: The completion of the invocation of the constructor synchronizes with the beginning of the invocation of the copy of f.
Ensures: get_­id() != id().
*this represents the newly started thread.
Throws: system_­error if unable to start the new thread.
Error conditions:
  • resource_­unavailable_­try_­again — the system lacked the necessary resources to create another thread, or the system-imposed limit on the number of threads in a process would be exceeded.
thread(thread&& x) noexcept;
Effects: Constructs an object of type thread from x, and sets x to a default constructed state.
Ensures: x.get_­id() == id() and get_­id() returns the value of x.get_­id() prior to the start of construction.