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
Libérer: 2024-12-26 16:38:09
original
189 Les gens l'ont consulté

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"; }
};
Copier après la connexion

Maintenant, créons un vecteur de Instances C :

vector<C> classes;
pthread_t t1;
classes.push_back(C());
classes.push_back(C());
Copier après la connexion

Pour créer un thread qui exécute c.print(), vous pouvez intuitivement write :

pthread_create(&t1, NULL, &c[0].print, NULL);
Copier après la connexion

Cependant, cela entraînera une erreur :

cannot convert ‘void* (tree_item::*)(void*)’ to ‘void* (*)(void*)’ 
Copier après la connexion

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; }
};
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

où hello_helper est défini comme :

void *hello_helper(void *context) { return ((C *)context)->hello(); }
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal