Heim >Backend-Entwicklung >C++ >Wie kann ich C-Klassen-Memberfunktionen in pthreads verwenden?
Klassenmitgliedsfunktionen in Threads integrieren
In C tragen Klassenmitgliedsfunktionen von Natur aus einen versteckten Parameter namens „this“. Dies stellt eine Herausforderung dar, wenn versucht wird, Threads mithilfe von Mitgliedsfunktionen zu erstellen, da die Funktion pthread_create() der Standardbibliothek einen Funktionszeiger ohne solche Parameter erwartet.
Kompilierungsfehler: Funktionszeiger konnte nicht konvertiert werden
Wie der erste Codeausschnitt zeigt, führt der Versuch, eine Klassenmitgliedsfunktion an pthread_create() zu übergeben, direkt zu einer Kompilierung Fehler:
pthread_create(&t1, NULL, &c[0].print, NULL);
Der Compiler beschwert sich, dass er den Mitgliedsfunktionszeiger (void* (tree_item::*)(void*)) nicht in den erwarteten Funktionszeigertyp (void* (*)(void) konvertieren kann *)).
Lösung: Statische Klassenmethode oder unabhängige Funktion
Um dieses Problem zu umgehen, gibt es zwei praktikable Ansätze:
Statische Klassenmethode:
Definieren Sie eine statische Klassenmethode (die keinen „this“-Zeiger akzeptiert), die die gewünschte Funktionalität kapselt:
class C { public: void *hello(void) { std::cout << "Hello, world!" << std::endl; return 0; } static void *hello_helper(void *context) { return ((C *)context)->hello(); } };
Unabhängig Funktion:
Erstellen Sie eine separate Funktion, die als Wrapper um die Klassenmitgliedsfunktion dient, und übergeben Sie dabei explizit den „this“-Zeiger als Argument:
void hello_wrapper(void *context) { C *object = (C *)context; object->print(); }
Thread-Erstellung mit statischer Klassenmethode oder Wrapper-Funktion
Mit jedem dieser Ansätze können Sie jetzt verwenden pthread_create() zum Erstellen von Threads, die die gewünschten Klassenmitgliedsfunktionen ausführen:
C c; pthread_create(&t, NULL, &C::hello_helper, &c); // Static Class Method pthread_create(&t, NULL, &hello_wrapper, &c); // Wrapper Function
Das obige ist der detaillierte Inhalt vonWie kann ich C-Klassen-Memberfunktionen in pthreads verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!