Heim > Backend-Entwicklung > C++ > Wie kann ich Mitgliedsfunktionen der C-Klasse sicher aus Threads aufrufen?

Wie kann ich Mitgliedsfunktionen der C-Klasse sicher aus Threads aufrufen?

Mary-Kate Olsen
Freigeben: 2024-12-26 16:38:09
Original
128 Leute haben es durchsucht

How Can I Safely Call C   Class Member Functions from Threads?

Klassenmitgliedsfunktionen in Threads sicher aufrufen

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

Jetzt erstellen wir einen Vektor von C-Instanzen:

vector<C> classes;
pthread_t t1;
classes.push_back(C());
classes.push_back(C());
Nach dem Login kopieren

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

Dies führt jedoch zu einem Fehler:

cannot convert ‘void* (tree_item::*)(void*)’ to ‘void* (*)(void*)’ 
Nach dem Login kopieren

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.

Die Lösung: Verwenden einer statischen Klassenmethode oder einer Funktion Zeiger

Um diese Hürde zu überwinden, haben Sie zwei Möglichkeiten:

Statische Klassenmethode

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

Dann können Sie einen Thread mit der statischen Klassenmethode erstellen:

pthread_create(&t, NULL, &C::hello, NULL);
Nach dem Login kopieren

Funktionszeiger

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

wobei hello_helper wie folgt definiert ist:

void *hello_helper(void *context) { return ((C *)context)->hello(); }
Nach dem Login kopieren

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!

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