Im Bereich Multithreading kommt es häufig vor, dass Mitgliedsfunktionen einer Klasse innerhalb der Threadausführung aufgerufen werden müssen. Allerdings kann diese Aufgabe aufgrund des versteckten „this“-Parameters in C-Klassen-Memberfunktionen eine Herausforderung darstellen.
Bedenken Sie zum Beispiel Folgendes:
class C { void *print(void *) { cout << "Hello"; } };
Jetzt erstellen wir einen Vektor von C-Instanzen:
vector<C> classes; pthread_t t1; classes.push_back(C()); classes.push_back(C());
Um einen Thread zu erstellen, der c.print() ausführt, können Sie dies intuitiv tun write:
pthread_create(&t1, NULL, &c[0].print, NULL);
Dies führt jedoch zu einem Fehler:
cannot convert ‘void* (tree_item::*)(void*)’ to ‘void* (*)(void*)’
Das Problem tritt auf, weil pthread_create() einen Funktionszeiger eines bestimmten Typs erwartet, während c[0] .print ist ein Zeiger auf eine Mitgliedsfunktion mit einem versteckten „this“-Parameter.
Um diese Hürde zu überwinden, haben Sie zwei Möglichkeiten:
Eine statische Klassenmethode hat keinen „this“-Parameter und kann ohne direkt aufgerufen werden eine Instanz der Klasse. So können Sie eine statische Klassenmethode für die Hallo-Funktion implementieren:
class C { public: static void *hello(void *) { std::cout << "Hello, world!" << std::endl; return 0; } };
Dann können Sie einen Thread mit der statischen Klassenmethode erstellen:
pthread_create(&t, NULL, &C::hello, NULL);
Eine weitere Option besteht darin, einen Funktionszeiger zu verwenden, der die Mitgliedsfunktion kapselt und den Parameter „this“ explizit bereitstellt. Dieser Funktionszeiger kann dann zum Erstellen eines Threads verwendet werden.
C c; pthread_create(&t, NULL, &C::hello_helper, &c);
wobei hello_helper wie folgt definiert ist:
void *hello_helper(void *context) { return ((C *)context)->hello(); }
Durch die Verwendung einer statischen Klassenmethode oder eines Funktionszeigers können Sie dies sicher tun Rufen Sie Mitgliedsfunktionen einer Klasse innerhalb eines Threads auf und vermeiden Sie so das Problem mit dem Parameter „dieser“.
Das obige ist der detaillierte Inhalt vonWie kann ich Mitgliedsfunktionen der C-Klasse sicher aus Threads aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!