Ежедневный бит (e) C++ # 8, новый стандартный поток: std::jthread

В C++20 мы получили новую версию стандартного потока в виде std::jthread (присоединяющийся поток).

С std::thread удерживаемый поток должен быть присоединен или отсоединен до того, как переменная будет уничтожена (иначе программа завершится).

std::jthread решает эту проблему, автоматически присоединяясь к деструктору, устраняя необходимость в обертках.

#include <chrono>
#include <thread>

{
// Spawn a thread:
auto t = std::thread([]{
    using namespace std::chrono_literals;
    std::this_thread::sleep_for(1s);
});
// Required join, will block until 1s sleep finishes.
t.join();
} // end of scope, t is destroyed

{
// Spawn a thread:
auto t = std::jthread([]{
    using namespace std::chrono_literals;
    std::this_thread::sleep_for(1s);
});
} // end of scope, t is destroyed
  // and the thread is joined as part of that

// Start a thread and immediately join,
// as the temporary return value is destroyed.
std::jthread([]{});
// Start a thread and (very likely) immediately terminate,
// as the temporary return value is destroyed.
std::thread([]{});

Откройте этот пример в Compiler Explorer.