Maison >développement back-end >C++ >Comment puis-je transmettre une fonction membre de classe C à pthread_create() ?

Comment puis-je transmettre une fonction membre de classe C à pthread_create() ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-26 01:17:10519parcourir

How Can I Pass a C   Class Member Function to pthread_create()?

Passer des fonctions de classe à pthread_create()

Considérons un scénario dans lequel nous avons une classe C contenant une fonction membre, "print", que nous voulons exécuter dans un thread séparé en utilisant pthread_create(). Cependant, nous avons rencontré une erreur de compilation :

pthread_create(&t1, NULL, &c[0].print, NULL);

Cette erreur est due au fait que la fonction membre de la classe C contient implicitement un this pointant vers la classe actuelle pointeur comme premier paramètre. Cependant, pthread_create() attend un pointeur de fonction standard, qui n'a pas de pointeur this. Par conséquent, le compilateur ne peut pas convertir un tel pointeur de fonction en type de fonction requis par pthread_create().

Solution

Pour résoudre ce problème, nous devons adopter une approche alternative qui nous permet d'appeler les fonctions membres de la classe depuis pthread_create(). Il existe deux approches courantes :

Utilisation de méthodes de classe statique

Les méthodes de classe statique ne contiennent pas ces pointeurs car elles ne sont pas associées à une instance de classe spécifique. Elle peut être appelée comme une fonction normale comme ceci :

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

int main()
{
    pthread_t t;
    pthread_create(&t, NULL, &C::hello, NULL);
    ...
}

Utiliser des fonctions wrapper

Une autre façon consiste à créer une fonction membre de classe enveloppée comme un wrapper de fonction normal fonction. Cette fonction wrapper accepte une instance de classe comme premier argument et appelle la fonction membre comme ceci :

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

    static void *hello_helper(void *context)
    {
        return ((C *)context)->hello();
    }
};

int main()
{
    C c;
    pthread_t t;
    pthread_create(&t, NULL, &C::hello_helper, &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!

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