Maison > développement back-end > C++ > Comment puis-je utiliser les fonctions membres de la classe C dans pthreads ?

Comment puis-je utiliser les fonctions membres de la classe C dans pthreads ?

Barbara Streisand
Libérer: 2024-12-23 04:29:20
original
405 Les gens l'ont consulté

How Can I Use C   Class Member Functions in pthreads?

Incorporation des fonctions membres de classe dans les threads

En C, les fonctions membres de classe portent intrinsèquement un paramètre caché appelé "this". Cela pose un défi lorsque l'on tente de créer des threads à l'aide de fonctions membres, car la fonction pthread_create() de la bibliothèque standard attend un pointeur de fonction sans de tels paramètres.

Erreur de compilation : impossible de convertir le pointeur de fonction

Comme l'illustre l'extrait de code initial, essayer de transmettre une fonction membre de classe à pthread_create() mène directement à une compilation erreur :

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

Le compilateur se plaint de ne pas pouvoir convertir le pointeur de fonction membre (void* (tree_item::*)(void*)) vers le type de pointeur de fonction attendu (void* (*)(void *)).

Solution : Méthode de classe statique ou fonction indépendante

Pour contourner ce problème, il y a existe deux approches viables :

  1. Méthode de classe statique :
    Définissez une méthode de classe statique (qui n'accepte pas de pointeur "this") qui encapsule le souhaité fonctionnalité :

    class C
    {
    public:
        void *hello(void)
        {
            std::cout << "Hello, world!" << std::endl;
            return 0;
        }
    
        static void *hello_helper(void *context)
        {
            return ((C *)context)->hello();
        }
    };
    Copier après la connexion
  2. Indépendant Fonction :
    Créez une fonction distincte qui sert de wrapper autour de la fonction membre de la classe, en passant explicitement le pointeur "this" comme argument :

    void hello_wrapper(void *context)
    {
        C *object = (C *)context;
        object->print();
    }
    Copier après la connexion

Création de threads à l'aide de la méthode de classe statique ou de la fonction Wrapper

Avec l'une ou l'autre de ces approches, vous pouvez désormais utiliser pthread_create() pour créer des threads qui exécuteront les fonctions membres de la classe souhaitées :

C c;
pthread_create(&amp;t, NULL, &amp;C::hello_helper, &amp;c);  // Static Class Method

pthread_create(&amp;t, NULL, &amp;hello_wrapper, &amp;c);  // Wrapper Function
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