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
Barbara Streisandoriginal
2024-12-23 04:29:20335parcourir

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);

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();
        }
    };
  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();
    }

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

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:
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