Übergabe von Objektreferenzargumenten an Thread-Funktionen: Ein Konstruktorproblem
In C 11 ermöglicht die std::thread-Schnittstelle die Erstellung von leichte Fäden. Eine häufige Aufgabe ist die Übergabe von Argumenten an diese Thread-Funktionen. Beim Versuch, Objektverweise zu übergeben, können jedoch Schwierigkeiten auftreten.
Betrachten Sie das folgende Beispiel:
void foo(int &i) { std::cout << i << std::endl; } int k = 10; std::thread t(foo, k);
Dieser Code wird erfolgreich kompiliert und ausgeführt, als Ganzzahlen werden in die Thread-Funktion kopiert. Die Übergabe einer std::ostream-Objektreferenz führt jedoch nicht zu einer Kompilierung:
void foo(std::ostream &os) { os << "This should be printed to os" << std::endl; } std::thread t(foo, std::cout);
Der Fehler weist auf einen fehlenden oder nicht zugänglichen Konstruktor hin.
Lösung: Verwendung von std::ref
Threads kopieren ihre Argumente standardmäßig. Um eine Referenz explizit zu übergeben, ist ein alternativer Ansatz erforderlich. Hier kommt std::ref ins Spiel. Es verpackt eine Objektreferenz in einen Wertesemantik-Wrapper.
Durch die Verwendung von std::ref erhält die Thread-Funktion eine Kopie des Wrappers, die verpackte Referenz bleibt jedoch erhalten das Gleiche:
std::thread t(foo, std::ref(std::cout));
Dadurch kann die Thread-Funktion auf das ursprüngliche Objekt zugreifen und es ändern, wodurch die gewünschte Funktionalität ermöglicht wird.
Es ist wichtig zu beachten, dass das Objekt, auf das verwiesen wird, durchgehend zugänglich bleiben muss die Ausführung des Threads. Wenn es gelöscht oder geändert wird, bevor der Thread beendet ist, kann es zu unerwartetem Verhalten oder Abstürzen kommen.
Das obige ist der detaillierte Inhalt vonWie kann ich Objektverweise sicher an C 11-Threads übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!