Maison >développement back-end >C++ >Comment puis-je appeler en toute sécurité des fonctions membres de la classe C à partir de threads ?

Comment puis-je appeler en toute sécurité des fonctions membres de la classe C à partir de threads ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-26 16:38:09221parcourir

How Can I Safely Call C   Class Member Functions from Threads?

Appel de fonctions membres de classe dans des threads en toute sécurité

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é.

La solution : utiliser une méthode de classe statique ou une 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 "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);

Pointeur de fonction

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn