Heim > Backend-Entwicklung > C++ > Wie erstelle ich Threads für C-Klassen-Memberfunktionen, die von einem Vektor aufgerufen werden?

Wie erstelle ich Threads für C-Klassen-Memberfunktionen, die von einem Vektor aufgerufen werden?

Patricia Arquette
Freigeben: 2024-12-25 19:53:12
Original
846 Leute haben es durchsucht

How to Create Threads for C   Class Member Functions Invoked from a Vector?

Threads für Klassenmitgliedsfunktionen erstellen

Problem:

Wie erstellt man wann einen Thread für eine Klassenmitgliedsfunktion? Die Funktion wird von einem Vektor von Klasseninstanzen aufgerufen?

Beispielcode und Fehler:

Bedenken Sie den folgenden Code:

class c {
    void *print(void *) { std::cout << "Hello"; }
};

std::vector<c> classes;
pthread_t t1;

classes.push_back(c());
classes.push_back(c());

// Attempt to create a thread for c.print()
pthread_create(&t1, NULL, &c[0].print, NULL);

// Error: "cannot convert 'void* (tree_item::*)(void*)' to 'void* (*)(void*)'"
Nach dem Login kopieren

Erklärung:

Der Fehler tritt auf, weil Mitgliedsfunktionen der C-Klasse eine implizite Funktion haben Dieser Parameter wird intern übergeben. Allerdings verarbeitet pthread_create() diesen versteckten Parameter nicht, was zu einer Typinkongruenz führt, wenn die Mitgliedsfunktion in einen Funktionszeiger umgewandelt wird.

Lösung:

Es gibt zwei Ansätze zu diesem Problem:

  1. Verwenden Sie eine statische Klasse Methode:

Diese Methode hat keinen this-Parameter, da sie mit der Klasse selbst und nicht mit einer Instanz verknüpft ist. Etwa so:

class C
{
public:
    static void *hello(void *)
    {
        std::cout << "Hello, world!" << std::endl;
        return 0;
    }

    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
  1. Verwenden Sie eine einfache gewöhnliche Funktion:

Diese Methode verwendet eine Funktion außerhalb der Klassendefinition, die auf die zugreifen kann Klasse und ihre Mitglieder mögen so:

// Outside the class
void c_print_wrapper(c *c_instance)
{
    c_instance->print();
}

...
c c1, c2;
pthread_t t1;
classes.push_back(c1);
classes.push_back(c2);

// Create the thread for c.print() using wrapper function
pthread_create(&t1, NULL, (void *(*)(void *))c_print_wrapper, &classes[0]);
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie erstelle ich Threads für C-Klassen-Memberfunktionen, die von einem Vektor aufgerufen werden?. 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