Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann ich Objektverweise sicher an C 11-Threads übergeben?

Patricia Arquette
Freigeben: 2024-11-19 14:57:03
Original
512 Leute haben es durchsucht

How Can I Safely Pass Object References to C  11 Threads?

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

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

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

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!

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