Heim >Backend-Entwicklung >C++ >Wie kann ich eine Member-Funktion der C-Klasse an pthread_create() übergeben?
Übergabe von Klassenfunktionen an pthread_create()
Betrachten wir ein Szenario, in dem wir eine C-Klasse haben, die eine Mitgliedsfunktion „print“ enthält. die wir in einem separaten Thread ausführen möchten pthread_create(). Es ist jedoch ein Kompilierungsfehler aufgetreten:
pthread_create(&t1, NULL, &c[0].print, NULL);
Dieser Fehler ist auf die Tatsache zurückzuführen, dass die C-Klassenmitgliedsfunktion implizit ein „this“ enthält, das auf die aktuelle Klasse verweist Zeiger als ersten Parameter. Allerdings erwartet pthread_create() einen Standardfunktionszeiger, der keinen this-Zeiger hat. Daher kann der Compiler einen solchen Funktionszeiger nicht in den für pthread_create() erforderlichen Funktionstyp konvertieren.
Lösung
Um dieses Problem zu lösen, müssen wir einen alternativen Ansatz verfolgen, der es uns ermöglicht, Klassenmitgliedsfunktionen von pthread_create() aus aufzurufen. Es gibt zwei gängige Ansätze:
Verwendung statischer Klassenmethoden
Statische Klassenmethoden enthalten diese Zeiger nicht, da sie keiner bestimmten Klasseninstanz zugeordnet sind. Sie kann wie eine normale Funktion wie folgt aufgerufen werden:
class C { public: static void *hello(void) { std::cout << "Hello, world!" << std::endl; return 0; } }; int main() { pthread_t t; pthread_create(&t, NULL, &C::hello, NULL); ... }
Wrapper-Funktionen verwenden
Eine andere Möglichkeit besteht darin, eine Klassenmitgliedsfunktion zu erstellen, die als normaler Funktions-Wrapper verpackt ist Funktion. Diese Wrapper-Funktion akzeptiert eine Klasseninstanz als erstes Argument und ruft die Member-Funktion wie folgt auf:
class C { public: void *hello(void) { std::cout << "Hello, world!" << std::endl; return 0; } static void *hello_helper(void *context) { return ((C *)context)->hello(); } }; int main() { C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &c); ... }
Das obige ist der detaillierte Inhalt vonWie kann ich eine Member-Funktion der C-Klasse an pthread_create() übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!