Namespaces
Variants

std::jthread:: jthread

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
jthread ( ) noexcept ;
(1) (seit C++20)
jthread ( jthread && other ) noexcept ;
(2) (seit C++20)
template < class F, class ... Args >
explicit jthread ( F && f, Args && ... args ) ;
(3) (seit C++20)
jthread ( const jthread & ) = delete ;
(4) (seit C++20)

Konstruiert ein neues std::jthread Objekt.

1) Erstellt ein neues std::jthread Objekt, das keinen Thread repräsentiert.
2) Move-Konstruktor. Konstruiert das std::jthread Objekt, um den Ausführungs-Thread darzustellen, der zuvor durch other repräsentiert wurde. Nach diesem Aufruf stellt other keinen Ausführungs-Thread mehr dar.
3) Erstellt ein neues std::jthread -Objekt und verknüpft es mit einem Ausführungs-Thread.

Der neue Ausführungs-Thread beginnt mit der Ausführung von:

std:: invoke ( decay-copy ( std:: forward < F > ( f ) ) , get_stop_token ( ) ,
decay-copy ( std:: forward < Args > ( args ) ) ... )
(bis C++23)

std:: invoke ( auto ( std:: forward < F > ( f ) ) , get_stop_token ( ) ,
auto ( std:: forward < Args > ( args ) ) ... )

(seit C++23)

falls der obige Ausdruck wohlgeformt ist, andernfalls beginnt die Ausführung von:

std:: invoke ( decay-copy ( std:: forward < F > ( f ) ) ,
decay-copy ( std:: forward < Args > ( args ) ) ... )
.
(bis C++23)

std:: invoke ( auto ( std:: forward < F > ( f ) ) ,
auto ( std:: forward < Args > ( args ) ) ... )
.

(seit C++23)
Die Aufrufe von decay-copy werden ausgewertet (until C++23) Die durch auto erzeugten Werte werden materialisiert (since C++23) im aktuellen Thread, sodass alle während der Auswertung und des Kopierens/Verschiebens der Argumente geworfenen Exceptions im aktuellen Thread geworfen werden, ohne einen neuen Thread zu starten.
Diese Überladungen nehmen an der Überladungsauflösung nur teil, wenn std:: remove_cvref_t < F > nicht denselben Typ wie std::jthread ist.
Wenn eines der folgenden Kriterien false ist, ist das Programm fehlerhaft:
Der Abschluss des Aufrufs des Konstruktors synchronisiert mit dem Beginn des Aufrufs der Kopie von f im neuen Ausführungsstrang.
4) Der Kopierkonstruktor ist gelöscht; Threads sind nicht kopierbar. Keine zwei std::jthread -Objekte dürfen denselben Ausführungs-Thread repräsentieren.

Inhaltsverzeichnis

Parameter

other - ein weiteres std::jthread Objekt, mit dem dieses std::jthread Objekt konstruiert werden soll
f - Callable Objekt, das im neuen Thread ausgeführt werden soll
args - Argumente, die an die neue Funktion übergeben werden sollen

Nachbedingungen

1) get_id() entspricht std::jthread::id() (d.h. joinable() gibt false zurück) und get_stop_source ( ) . stop_possible ( ) ist false .
2) other. get_id ( ) gleich std::jthread::id() und get_id() gibt den Wert von other. get_id ( ) vor Beginn der Konstruktion zurück.
3) get_id() ungleich std::jthread::id() (d.h. joinable() gibt true zurück), und get_stop_source ( ) . stop_possible ( ) ist true .

Exceptions

3) std::system_error falls der Thread nicht gestartet werden konnte. Die Exception kann den Fehlerzustand std::errc::resource_unavailable_try_again oder einen anderen implementationsspezifischen Fehlerzustand repräsentieren.

Hinweise

Die Argumente für die Thread-Funktion werden durch Verschieben oder Kopieren als Wert übergeben. Wenn ein Referenzargument an die Thread-Funktion übergeben werden muss, muss es umschlossen werden (z.B. mit std::ref oder std::cref ).

Jeder Rückgabewert der Funktion wird ignoriert. Wenn die Funktion eine Exception wirft, std::terminate wird aufgerufen. Um Rückgabewerte oder Exceptions an den aufrufenden Thread zurückzugeben, std::promise oder std::async können verwendet werden.

Beispiel

#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 ist kein Thread
    std::jthread t1(f1, n + 1); // call by value
    std::jthread t2a(f2, std::ref(n)); // call by reference
    std::jthread t2b(std::move(t2a)); // t2b führt nun f2() aus. t2a ist kein Thread mehr
    std::jthread t3(&foo::bar, &f); // t3 führt foo::bar() auf Objekt f aus
    std::jthread t4(b); // t4 führt baz::operator() auf einer Kopie von Objekt b aus
    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 führt join bei Zerstörung aus
}

Mögliche Ausgabe:

Thread 2 executing
Thread 1 executing
Thread 4 executing
Thread 3 executing
Thread 3 executing
Thread 4 executing
Thread 2 executing
Thread 1 executing
Thread 3 executing
Thread 1 executing
Thread 4 executing
Thread 2 executing
Thread 3 executing
Thread 1 executing
Thread 4 executing
Thread 2 executing
Thread 3 executing
Thread 1 executing
Thread 4 executing
Thread 2 executing
Final value of n is 5
Final value of f.n (foo::n) is 5
Final value of b.n (baz::n) is 0

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3476 C++20 Überladung (3) erforderte direkt, dass (die zerfallenen Typen von)
F und die Argumenttypen move-konstruierbar sind
diese Anforderungen
entfernt [1]
  1. Die Move-Konstruierbarkeit ist bereits indirekt durch std::is_constructible_v vorausgesetzt.

Siehe auch

konstruiert neues thread Objekt
(öffentliche Elementfunktion von std::thread )
C-Dokumentation für thrd_create