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
Freigeben: 2024-12-03 12:10:16
Original
623 Leute haben es durchsucht

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);
Nach dem Login kopieren

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);
Nach dem Login kopieren

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));
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage