Dans le domaine de laading multithread, il est commun de rencontrer la nécessité d'invoquer les fonctions membres d'une classe dans l'exécution du thread. Cependant, cette tâche peut présenter des défis en raison du paramètre "ce" paramètre caché dans les fonctions membres de la classe C.
Par exemple, considérez ce qui suit:
class C { void *print(void *) { coutMaintenant, créons un vecteur de C instances:
vectorclasses; pthread_t t1; classes.push_back(C()); classes.push_back(C()); pour créer un thread qui exécute c.print (), vous pouvez écrire intuitivement:
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 parce que pthread_create () attend un pointeur de fonction d'un type spécifique, tandis que c [0] .print est un pointeur vers une fonction membre avec une solution cachée:" cette fonction "
Pointeur
Pour surmonter cet obstacle, vous avez deux options:
méthode de classe statique
Une méthode de classe statique n'a pas de paramètre "ce" et peut être appelé directement sans une instance de la classe. Voici comment vous pouvez implémenter une méthode de classe statique pour la fonction Hello:
class C { public: static void *hello(void *) { std::coutEnsuite, vous pouvez créer un thread à l'aide de la méthode de classe statique:
pthread_create(&t, NULL, &C::hello, NULL);Fonction Pointer
Une autre option consiste à utiliser un pointeur de fonction qui encapsulate la fonction des membres et fournit la fonction de la fonction de la fonction. Ce pointeur de fonction peut ensuite être utilisé pour créer un thread.
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 invoquer en toute sécurité les fonctions membres d'une classe dans un thread, en évitant le problème de paramètre "ce".
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3