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*)'"
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:
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);
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]);
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!