"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je appeler en toute sécurité les fonctions membres de la classe C ++ à partir de threads?

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

Publié le 2025-03-04
Parcourir:276

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

APPEL des fonctions de membre de classe dans les threads Safely

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 *) { cout  

Maintenant, créons un vecteur de C instances:

vector classes;
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::cout  

Ensuite, 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".

Dernier tutoriel Plus>

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