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
Mary-Kate OlsenOriginal
2024-12-26 16:38:09192Durchsuche

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"; }
};

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.

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; }
};

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

pthread_create(&t, NULL, &C::hello, NULL);

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);

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!

Stellungnahme:
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