Maison > développement back-end > C++ > Comment créer des threads pour les fonctions membres de la classe C invoquées à partir d'un vecteur ?

Comment créer des threads pour les fonctions membres de la classe C invoquées à partir d'un vecteur ?

Patricia Arquette
Libérer: 2024-12-25 19:53:12
original
933 Les gens l'ont consulté

How to Create Threads for C   Class Member Functions Invoked from a Vector?

Création de fils de discussion pour les fonctions membres de classe

Problème :

Comment créer un fil de discussion pour une fonction membre de classe lorsque la fonction est invoquée à partir d'un vecteur d'instances de classe ?

Exemple de code et Erreur :

Considérez le code suivant :

class c {
    void *print(void *) { std::cout << "Hello"; }
};

std::vector<c> classes;
pthread_t t1;

classes.push_back(c());
classes.push_back(c());

// Attempt to create a thread for c.print()
pthread_create(&t1, NULL, &c[0].print, NULL);

// Error: "cannot convert 'void* (tree_item::*)(void*)' to 'void* (*)(void*)'"
Copier après la connexion

Explication :

L'erreur se produit car les fonctions membres de la classe C ont un implicite ce paramètre, qui est passé en interne. Cependant, pthread_create() ne gère pas ce paramètre caché, provoquant une incompatibilité de type lors de la conversion de la fonction membre en pointeur de fonction.

Solution :

Il existe deux approches à ce problème :

  1. Utiliser une classe statique méthode :

Cette méthode n'a pas de paramètre this, car elle est associée à la classe elle-même, pas à une instance. Comme ceci :

class C
{
public:
    static void *hello(void *)
    {
        std::cout << "Hello, world!" << std::endl;
        return 0;
    }

    static void *hello_helper(void *context)
    {
        return ((C *)context)->hello();
    }
};
...
C c;
pthread_t t;
pthread_create(&t, NULL, &C::hello_helper, &c);
Copier après la connexion
  1. Utilisez une fonction ordinaire simple :

Cette méthode utilise une fonction en dehors de la définition de la classe, qui peut accéder au la classe et ses membres aiment ainsi :

// Outside the class
void c_print_wrapper(c *c_instance)
{
    c_instance->print();
}

...
c c1, c2;
pthread_t t1;
classes.push_back(c1);
classes.push_back(c2);

// Create the thread for c.print() using wrapper function
pthread_create(&t1, NULL, (void *(*)(void *))c_print_wrapper, &classes[0]);
Copier après la connexion

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