Dans le domaine du multithreading, il est courant de rencontrer le besoin d'invoquer les fonctions membres d'une classe au cours de l'exécution du thread. Cependant, cette tâche peut présenter des défis en raison du paramètre "this" caché dans les fonctions membres de la classe C.
Par exemple, considérons ce qui suit :
class C { void *print(void *) { cout << "Hello"; } };
Maintenant, créons un vecteur de Instances C :
vector<C> classes; pthread_t t1; classes.push_back(C()); classes.push_back(C());
Pour créer un thread qui exécute c.print(), vous pouvez intuitivement write :
pthread_create(&t1, NULL, &c[0].print, NULL);
Cependant, cela entraînera une erreur :
cannot convert ‘void* (tree_item::*)(void*)’ to ‘void* (*)(void*)’
Le problème se pose car pthread_create() attend un pointeur de fonction d'un type spécifique, alors que c[0] .print est un pointeur vers une fonction membre avec un paramètre "this" masqué.
Pour surmonter cet obstacle, vous avez deux options :
Une méthode de classe statique n'a pas de paramètre "this" et peut être appelée directement sans une instance de la classe. Voici comment implémenter une méthode de classe statique pour la fonction hello :
class C { public: static void *hello(void *) { std::cout << "Hello, world!" << std::endl; return 0; } };
Ensuite, vous pouvez créer un fil de discussion à l'aide de la méthode de classe statique :
pthread_create(&t, NULL, &C::hello, NULL);
Une autre option consiste à utiliser un pointeur de fonction qui encapsule la fonction membre et fournit explicitement le paramètre "this". Ce pointeur de fonction peut ensuite être utilisé pour créer un fil de discussion.
C c; pthread_create(&t, NULL, &C::hello_helper, &c);
où hello_helper est défini comme :
void *hello_helper(void *context) { return ((C *)context)->hello(); }
En utilisant une méthode de classe statique ou un pointeur de fonction, vous pouvez en toute sécurité invoquez les fonctions membres d'une classe dans un thread, évitant ainsi le problème du paramètre "this".
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!