5.4 KiB
[thread.jthread.cons]
32 Concurrency support library [thread]
32.4 Threads [thread.threads]
32.4.4 Class jthread [thread.jthread.class]
32.4.4.2 Constructors, move, and assignment [thread.jthread.cons]
jthread() noexcept;
Effects: Constructs a jthread object that does not represent a thread of execution.
Postconditions: get_id() == id() is true and ssource.stop_possible() is false.
template<class F, class... Args> explicit jthread(F&& f, Args&&... args);
Constraints: remove_cvref_t is not the same type as jthread.
Mandates: The following are all true:
is_constructible_v<decay_t, F>,
(is_constructible_v<decay_t, Args> && ...), and
is_invocable_v<decay_t, decay_t...> ||
is_invocable_v<decay_t, stop_token, decay_t...>.
Effects: Initializes ssource.
The new thread of execution executesinvoke(auto(std::forward(f)), get_stop_token(), // for invoke, see [func.invoke]auto(std::forward(args))...) if that expression is well-formed, otherwiseinvoke(auto(std::forward(f)), auto(std::forward(args))...) with the values produced by auto being materialized ([conv.rval]) in the constructing thread.
Any return value from this invocation is ignored.
[Note 1:
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 true and ssource.stop_possible() is true and *this represents the newly started thread.
[Note 2:
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.ssource prior to the start of construction and x.ssource.stop_possible() is false.
~jthread();
Effects: If joinable() is true, calls request_stop() and then join().
[Note 3:
Operations on *this are not synchronized.
â end note]
jthread& operator=(jthread&& x) noexcept;
Effects: If &x == this is true, there are no effects.
Otherwise, if joinable() is true, calls request_stop() and then join(), then assigns the state of x to *this and sets x to a default constructed state.
Postconditions: get_id() returns the value of x.get_id() prior to the assignment.
ssource has the value of x.ssource prior to the assignment.
Returns: *this.