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
Freigeben: 2024-12-22 04:48:09
Original
867 Leute haben es durchsucht

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

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

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

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

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!

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