Maison > développement back-end > C++ > Comment créer correctement des threads pour les fonctions membres de la classe C ?

Comment créer correctement des threads pour les fonctions membres de la classe C ?

Barbara Streisand
Libérer: 2024-12-22 04:48:09
original
845 Les gens l'ont consulté

How to Correctly Create Threads for C   Class Member Functions?

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

Lorsque vous travaillez avec des classes C, un défi courant consiste à créer des fils de discussion sur les fonctions membres. Considérons la classe suivante :

class c { 
    // ...
    void *print(void *){ cout << "Hello"; }
}
Copier après la connexion

Disons que nous avons un vecteur d'objets c et que nous souhaitons créer un fil de discussion sur la fonction c.print(). Cependant, le code suivant entraîne une erreur :

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

Le message d'erreur indique que le pointeur de fonction ne correspond pas au type attendu pour le troisième argument de pthread_create().

Solution :

L'erreur se produit car les fonctions membres de la classe C ont un paramètre masqué transmis implicitement. pthread_create() ne sait pas quelle instance de c utiliser pour le paramètre this. Pour résoudre ce problème, nous devons utiliser une méthode de classe statique (qui n'a pas de paramètre this) ou une fonction simple pour amorcer la classe.

Approche de la méthode de classe statique :

class C
{
public:
    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

Cette approche définit une méthode de classe statique hello_helper(), qui n'a pas de paramètre this et encapsule l'appel au membre hello() function.

Approche de fonction simple :

void hello(void *context)
{
    C *c = (C *)context;
    c->hello();
}

// ...

C c;
pthread_t t;
pthread_create(&t, NULL, &hello, &c);
Copier après la connexion

Ici, nous définissons une fonction simple hello() qui prend un pointeur vide qui lui passe et le convertit en un exemple de c. Nous appelons ensuite la fonction membre hello() sur l'instance c.

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