|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
jthread::jthread | ||||
| Observers | ||||
| Operations | ||||
| Stop token handling | ||||
| Non-member functions | ||||
jthread()noexcept; | (1) | (since C++20) |
jthread( jthread&& other)noexcept; | (2) | (since C++20) |
template<class F,class...Args> explicit jthread( F&& f, Args&&...args); | (3) | (since C++20) |
jthread(const jthread&)= delete; | (4) | (since C++20) |
Constructs newstd::jthread object.
std::jthread object which does not represent a thread.std::jthread object to represent the thread of execution that was represented byother. After this callother no longer represents a thread of execution.std::jthread object and associates it with a thread of execution.The new thread of execution starts executing:
std::invoke(decay-copy(std::forward<F>(f)), get_stop_token(), decay-copy(std::forward<Args>(args))...) | (until C++23) |
std::invoke(auto(std::forward<F>(f)), get_stop_token(), | (since C++23) |
if the expression above is well-formed, otherwise starts executing:
std::invoke(decay-copy(std::forward<F>(f)), decay-copy(std::forward<Args>(args))...). | (until C++23) |
std::invoke(auto(std::forward<F>(f)), | (since C++23) |
std::jthread.std::jthread objects may represent the same thread of execution.Contents |
| other | - | anotherstd::jthread object to construct thisstd::jthread object with |
| f | - | Callable object to execute in the new thread |
| args | - | arguments to pass to the new function |
get_id() equal tostd::jthread::id() (i.e.joinable() returnsfalse) andget_stop_source().stop_possible() isfalse.get_id() returns the value ofother.get_id() prior to the start of construction.get_id() not equal tostd::jthread::id() (i.e.joinable() returnstrue), andget_stop_source().stop_possible() istrue.std::errc::resource_unavailable_try_again or another implementation-specific error condition.The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. withstd::ref orstd::cref).
Any return value from the function is ignored. If the function throws an exception,std::terminate is called. In order to pass return values or exceptions back to the calling thread,std::promise orstd::async may be used.
#include <chrono>#include <iostream>#include <thread>#include <utility> usingnamespace std::literals; void f1(int n){for(int i=0; i<5;++i){std::cout<<"Thread 1 executing\n";++n;std::this_thread::sleep_for(10ms);}} void f2(int& n){for(int i=0; i<5;++i){std::cout<<"Thread 2 executing\n";++n;std::this_thread::sleep_for(10ms);}} class foo{public:void bar(){for(int i=0; i<5;++i){std::cout<<"Thread 3 executing\n";++n;std::this_thread::sleep_for(10ms);}}int n=0;}; class baz{public:void operator()(){for(int i=0; i<5;++i){std::cout<<"Thread 4 executing\n";++n;std::this_thread::sleep_for(10ms);}}int n=0;}; int main(){int n=0; foo f; baz b;std::jthread t0;// t0 is not a threadstd::jthread t1(f1, n+1);// pass by valuestd::jthread t2a(f2,std::ref(n));// pass by referencestd::jthread t2b(std::move(t2a));// t2b is now running f2(). t2a is no longer a threadstd::jthread t3(&foo::bar,&f);// t3 runs foo::bar() on object fstd::jthread t4(b);// t4 runs baz::operator() on a copy of object b t1.join(); t2b.join(); t3.join();std::cout<<"Final value of n is "<< n<<'\n';std::cout<<"Final value of f.n (foo::n) is "<< f.n<<'\n';std::cout<<"Final value of b.n (baz::n) is "<< b.n<<'\n';// t4 joins on destruction}
Possible output:
Thread 2 executingThread 1 executingThread 4 executingThread 3 executingThread 3 executingThread 4 executingThread 2 executingThread 1 executingThread 3 executingThread 1 executingThread 4 executingThread 2 executingThread 3 executingThread 1 executingThread 4 executingThread 2 executingThread 3 executingThread 1 executingThread 4 executingThread 2 executingFinal value of n is 5Final value of f.n (foo::n) is 5Final value of b.n (baz::n) is 0
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3476 | C++20 | overload(3) directly required (the decayed types of)F and the argument types to be move constructible | removed these requirements[1] |
constructs newthread object(public member function of std::thread)[edit] | |
C documentation forthrd_create | |