Heim >Backend-Entwicklung >C++ >Warum führt die Übergabe von Objektverweisen an C-Threads zu Kompilierungsfehlern?

Warum führt die Übergabe von Objektverweisen an C-Threads zu Kompilierungsfehlern?

Linda Hamilton
Linda HamiltonOriginal
2024-12-03 12:10:16692Durchsuche

Why Does Passing Object References to C   Threads Cause Compilation Errors?

Übergabe von Objektreferenzen an Thread-Funktionen: Die Herausforderungen verstehen

Übergabe von Objektreferenzargumenten an den Thread in der std::thread-Schnittstelle von C Bei Funktionen kann es zu Kompilierungsfehlern kommen. In diesem Artikel werden die zugrunde liegenden Gründe für diese Fehler untersucht und Lösungen bereitgestellt.

Grundlegendes zur Übergabe von Objektreferenzen

Im bereitgestellten Beispiel kann eine ganze Zahl (k) an a übergeben werden Thread-Funktion wie folgt:

void foo(int &i) {
    // Do something with i
    std::cout << i << std::endl;
}

int k = 10;
std::thread t(foo, k);

Der Versuch, eine Ostream-Referenz an eine Thread-Funktion zu übergeben, führt jedoch zu einer Kompilierung Fehler:

void foo(std::ostream &os) {
    // Do something with os
    os << "This should be printed to os" << std::endl;
}

std::thread t(foo, std::cout);

Der gelöschte Konstruktor

Der Kompilierungsfehler beruht auf der Tatsache, dass std::thread einen gelöschten Konstruktor hat, der die direkte Übergabe von Objektreferenzen verhindert. Dies ist beabsichtigt, da Threads ihre Argumente kopieren sollten, um Race Conditions zu vermeiden.

Die Lösung: std::ref

Um eine Objektreferenz explizit zu übergeben, schließen Sie sie mit ein std::ref (oder std::cref für konstante Referenzen). Diese Lösung stellt sicher, dass eine Kopie der Referenz an die Thread-Funktion übergeben wird, was die Sicherheit gewährleistet:

std::thread t(foo, std::ref(std::cout));

Erhaltung der Objektlebensdauer

Es ist wichtig zu beachten, dass die Der Referenz-Wrapper enthält nur einen Verweis auf das Objekt. Daher ist es wichtig sicherzustellen, dass das Objekt während der gesamten Ausführung des Threads am Leben bleibt. Andernfalls führt dies zu undefiniertem Verhalten.

Das obige ist der detaillierte Inhalt vonWarum führt die Übergabe von Objektverweisen an C-Threads zu Kompilierungsfehlern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn