Heim >Backend-Entwicklung >C++ >Wie erstellt man Threads für C-Klassen-Memberfunktionen richtig?

Wie erstellt man Threads für C-Klassen-Memberfunktionen richtig?

Barbara Streisand
Barbara StreisandOriginal
2024-12-22 04:48:09844Durchsuche

How to Correctly Create Threads for C   Class Member Functions?

Threads für Klassenmitgliedsfunktionen erstellen

Bei der Arbeit mit C-Klassen besteht eine häufige Herausforderung darin, Threads für Mitgliedsfunktionen zu erstellen. Betrachten Sie die folgende Klasse:

class c { 
    // ...
    void *print(void *){ cout << "Hello"; }
}

Angenommen, wir haben einen Vektor von C-Objekten und möchten einen Thread für die Funktion c.print() erstellen. Der folgende Code führt jedoch zu einem Fehler:

pthread_create(&t1, NULL, &c[0].print, NULL);

Die Fehlermeldung zeigt an, dass der Funktionszeiger nicht mit dem erwarteten Typ für das dritte Argument von pthread_create() übereinstimmt.

Lösung:

Der Fehler tritt auf, weil C-Klassen-Memberfunktionen einen versteckten Parameter haben, der implizit übergeben wird. pthread_create() weiß nicht, welche Instanz von c für diesen Parameter verwendet werden soll. Um dieses Problem zu lösen, müssen wir eine statische Klassenmethode (die diesen Parameter nicht hat) oder eine einfache Funktion verwenden, um die Klasse zu booten.

Statischer Klassenmethodenansatz:

class C
{
public:
    static void *hello_helper(void *context)
    {
        return ((C *)context)->hello();
    }
};

// ...

C c;
pthread_t t;
pthread_create(&t, NULL, &C::hello_helper, &c);

Dieser Ansatz definiert eine statische Klassenmethode hello_helper(), die diesen Parameter nicht hat und den Aufruf an das hello()-Mitglied umschließt Funktion.

Einfacher Funktionsansatz:

void hello(void *context)
{
    C *c = (C *)context;
    c->hello();
}

// ...

C c;
pthread_t t;
pthread_create(&t, NULL, &hello, &c);

Hier definieren wir eine einfache Funktion hello(), die einen an sie übergebenen Void-Zeiger entgegennimmt und ihn in eine umwandelt Beispiel von c. Anschließend rufen wir die Memberfunktion hello() auf der c-Instanz auf.

Das obige ist der detaillierte Inhalt vonWie erstellt man Threads für C-Klassen-Memberfunktionen richtig?. 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