[thread.jthread.cons] (original) (raw)
32 Thread support library [thread]
32.4 Threads [thread.threads]
32.4.3 Class jthread [thread.jthread.class]
32.4.3.1 Constructors, move, and assignment [thread.jthread.cons]
Effects:Constructs a jthread object that does not represent a thread of execution.
Postconditions: get_id() == id() is trueand ssource.stop_possible() is false.
template<class F, class... Args> explicit jthread(F&& f, Args&&... args);
Constraints: remove_cvref_t<F> is not the same type as jthread.
Mandates:The following are all true:
- is_constructible_v<decay_t<F>, F>,
- (is_constructible_v<decay_t<Args>, Args> && ...),
- is_move_constructible_v<decay_t<F>>,
- (is_move_constructible_v<decay_t<Args>> && ...), and
- is_invocable_v<decay_t<F>, decay_t<Args>...> ||
is_invocable_v<decay_t<F>, stop_token, decay_t<Args>...>.
Preconditions: decay_t<F> and each type in decay_t<Args> meet theCpp17MoveConstructible requirements.
Effects:Initializes ssource.
The new thread of execution executes
invoke(decay-copy(std::forward(f)), get_stop_token(), decay-copy(std::forward(args))...)
if that expression is well-formed, otherwise
invoke(decay-copy(std::forward(f)), decay-copy(std::forward(args))...)
with the calls todecay-copy being evaluated in the constructing thread.
Any return value from this invocation is ignored.
[ Note
:
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 invoke expression exits via an exception,terminate is called.
Synchronization:The completion of the invocation of the constructor synchronizes with the beginning of the invocation of the copy of f.
Postconditions: get_id() != id() is trueand ssource.stop_possible() is trueand *this represents the newly started thread.
[ Note
:
The calling thread can make a stop request only once, because it cannot replace this stop token.
— end note
]
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.
jthread(jthread&& x) noexcept;
Postconditions: x.get_id() == id()and get_id() returns the value of x.get_id()prior to the start of construction.
ssource has the value of x.ssourceprior to the start of construction and x.ssource.stop_possible() is false.
Effects:If joinable() is true, calls request_stop() and then join().
[ Note
:
Operations on *this are not synchronized.
— end note
]
jthread& operator=(jthread&& x) noexcept;
Effects:If joinable() is true, calls request_stop() and then join().
Assigns the state of x to *thisand sets x to a default constructed state.
Postconditions: x.get_id() == id()and get_id() returns the value of x.get_id()prior to the assignment.
ssource has the value of x.ssourceprior to the assignment and x.ssource.stop_possible() is false.