Heim > Artikel > Backend-Entwicklung > Wie übergebe ich Objektverweise korrekt an C 11 std::thread-Funktionen?
Übergabe von Objektverweisen an die Thread-Funktion
Beim Arbeiten mit der C 11 std::thread-Schnittstelle kann es beim Übergabeversuch zu Problemen kommen Objektreferenzen als Argumente für die Thread-Funktion. Dieses Problem tritt auch bei der Übergabe einfacher Ganzzahlen auf, wie im folgenden Code beobachtet:
void foo(int& i) { // Do something with i std::cout << i << std::endl; } int k = 10; std::thread t(foo, k);
Dieser Code wird wie erwartet kompiliert und ausgeführt, aber die Übergabe einer std::ostream-Referenz führt zu einem Kompilierungsfehler:
void foo(std::ostream& os) { // Do something with os os << "This should be printed to os" << std::endl; } std::thread t(foo, std::cout);
Ursache des Kompilierungsfehlers
Der Kompilierungsfehler ist auf den gelöschten Konstruktor für zurückzuführen std::thread. Standardmäßig kopieren Threads ihre Argumente, was es unmöglich macht, eine Referenz direkt zu übergeben.
Lösung: Verwendung von std::ref
Um eine Referenz als Argument an zu übergeben Wenn Sie eine Thread-Funktion verwenden möchten, müssen Sie sie mit std::ref (oder std::cref für konstante Referenzen) umschließen. Dadurch wird ein Referenz-Wrapper mit Wertesemantik erstellt, der das Vorhandensein von Kopien der Referenz ermöglicht.
std::thread t(foo, std::ref(std::cout));
Durch die Verwendung von std::ref können Sie eine Referenz an die Thread-Funktion übergeben und so eine direkte Manipulation der übergebenen Referenz ermöglichen Objekt. Es ist jedoch wichtig sicherzustellen, dass das referenzierte Objekt für die Dauer der Thread-Ausführung am Leben bleibt.
Das obige ist der detaillierte Inhalt vonWie übergebe ich Objektverweise korrekt an C 11 std::thread-Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!