std::jthread::jthread
Min standard notice:
Constructs new std::jthread object.
# Declarations
jthread() noexcept;
(since C++20)
jthread( jthread&& other ) noexcept;
(since C++20)
template< class F, class... Args >
explicit jthread( F&& f, Args&&... args );
(since C++20)
jthread( const jthread& ) = delete;
(since C++20)
# Parameters
other: another std::jthread object to construct this std::jthread object withf: Callable object to execute in the new threadargs: arguments to pass to the new function
# Notes
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. with std::ref or std::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 or std::async may be used.
# Example
#include <chrono>
#include <iostream>
#include <thread>
#include <utility>
using namespace 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 thread
std::jthread t1(f1, n + 1); // pass by value
std::jthread t2a(f2, std::ref(n)); // pass by reference
std::jthread t2b(std::move(t2a)); // t2b is now running f2(). t2a is no longer a thread
std::jthread t3(&foo::bar, &f); // t3 runs foo::bar() on object f
std::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
}
# Defect reports
| 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 theserequirements[1] |