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
846 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!

source:php.cn
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