Ü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!