Maison >développement back-end >C++ >Comment puis-je transmettre une fonction membre de classe C à pthread_create() ?
Passer des fonctions de classe à pthread_create()
Considérons un scénario dans lequel nous avons une classe C contenant une fonction membre, "print", que nous voulons exécuter dans un thread séparé en utilisant pthread_create(). Cependant, nous avons rencontré une erreur de compilation :
pthread_create(&t1, NULL, &c[0].print, NULL);
Cette erreur est due au fait que la fonction membre de la classe C contient implicitement un this pointant vers la classe actuelle pointeur comme premier paramètre. Cependant, pthread_create() attend un pointeur de fonction standard, qui n'a pas de pointeur this. Par conséquent, le compilateur ne peut pas convertir un tel pointeur de fonction en type de fonction requis par pthread_create().
Solution
Pour résoudre ce problème, nous devons adopter une approche alternative qui nous permet d'appeler les fonctions membres de la classe depuis pthread_create(). Il existe deux approches courantes :
Utilisation de méthodes de classe statique
Les méthodes de classe statique ne contiennent pas ces pointeurs car elles ne sont pas associées à une instance de classe spécifique. Elle peut être appelée comme une fonction normale comme ceci :
class C { public: static void *hello(void) { std::cout << "Hello, world!" << std::endl; return 0; } }; int main() { pthread_t t; pthread_create(&t, NULL, &C::hello, NULL); ... }
Utiliser des fonctions wrapper
Une autre façon consiste à créer une fonction membre de classe enveloppée comme un wrapper de fonction normal fonction. Cette fonction wrapper accepte une instance de classe comme premier argument et appelle la fonction membre comme ceci :
class C { public: void *hello(void) { std::cout << "Hello, world!" << std::endl; return 0; } static void *hello_helper(void *context) { return ((C *)context)->hello(); } }; int main() { C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &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!