Heim >Backend-Entwicklung >C++ >Wie erstellt man Threads für C-Klassen-Memberfunktionen richtig?
Threads für Klassenmitgliedsfunktionen erstellen
Bei der Arbeit mit C-Klassen besteht eine häufige Herausforderung darin, Threads für Mitgliedsfunktionen zu erstellen. Betrachten Sie die folgende Klasse:
class c { // ... void *print(void *){ cout << "Hello"; } }
Angenommen, wir haben einen Vektor von C-Objekten und möchten einen Thread für die Funktion c.print() erstellen. Der folgende Code führt jedoch zu einem Fehler:
pthread_create(&t1, NULL, &c[0].print, NULL);
Die Fehlermeldung zeigt an, dass der Funktionszeiger nicht mit dem erwarteten Typ für das dritte Argument von pthread_create() übereinstimmt.
Lösung:
Der Fehler tritt auf, weil C-Klassen-Memberfunktionen einen versteckten Parameter haben, der implizit übergeben wird. pthread_create() weiß nicht, welche Instanz von c für diesen Parameter verwendet werden soll. Um dieses Problem zu lösen, müssen wir eine statische Klassenmethode (die diesen Parameter nicht hat) oder eine einfache Funktion verwenden, um die Klasse zu booten.
Statischer Klassenmethodenansatz:
class C { public: static void *hello_helper(void *context) { return ((C *)context)->hello(); } }; // ... C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &c);
Dieser Ansatz definiert eine statische Klassenmethode hello_helper(), die diesen Parameter nicht hat und den Aufruf an das hello()-Mitglied umschließt Funktion.
Einfacher Funktionsansatz:
void hello(void *context) { C *c = (C *)context; c->hello(); } // ... C c; pthread_t t; pthread_create(&t, NULL, &hello, &c);
Hier definieren wir eine einfache Funktion hello(), die einen an sie übergebenen Void-Zeiger entgegennimmt und ihn in eine umwandelt Beispiel von c. Anschließend rufen wir die Memberfunktion hello() auf der c-Instanz auf.
Das obige ist der detaillierte Inhalt vonWie erstellt man Threads für C-Klassen-Memberfunktionen richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!