Création de fils de discussion sur les fonctions membres de classe
Lorsque vous travaillez avec des classes C, un défi courant consiste à créer des fils de discussion sur les fonctions membres. Considérons la classe suivante :
class c { // ... void *print(void *){ cout << "Hello"; } }
Disons que nous avons un vecteur d'objets c et que nous souhaitons créer un fil de discussion sur la fonction c.print(). Cependant, le code suivant entraîne une erreur :
pthread_create(&t1, NULL, &c[0].print, NULL);
Le message d'erreur indique que le pointeur de fonction ne correspond pas au type attendu pour le troisième argument de pthread_create().
Solution :
L'erreur se produit car les fonctions membres de la classe C ont un paramètre masqué transmis implicitement. pthread_create() ne sait pas quelle instance de c utiliser pour le paramètre this. Pour résoudre ce problème, nous devons utiliser une méthode de classe statique (qui n'a pas de paramètre this) ou une fonction simple pour amorcer la classe.
Approche de la méthode de classe statique :
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);
Cette approche définit une méthode de classe statique hello_helper(), qui n'a pas de paramètre this et encapsule l'appel au membre hello() function.
Approche de fonction simple :
void hello(void *context) { C *c = (C *)context; c->hello(); } // ... C c; pthread_t t; pthread_create(&t, NULL, &hello, &c);
Ici, nous définissons une fonction simple hello() qui prend un pointeur vide qui lui passe et le convertit en un exemple de c. Nous appelons ensuite la fonction membre hello() sur l'instance c.
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!