Heim >Backend-Entwicklung >C++ >Wie kann ich eine Member-Funktion der C-Klasse an pthread_create() übergeben?

Wie kann ich eine Member-Funktion der C-Klasse an pthread_create() übergeben?

Barbara Streisand
Barbara StreisandOriginal
2024-12-26 01:17:10541Durchsuche

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

Übergabe von Klassenfunktionen an pthread_create()

Betrachten wir ein Szenario, in dem wir eine C-Klasse haben, die eine Mitgliedsfunktion „print“ enthält. die wir in einem separaten Thread ausführen möchten pthread_create(). Es ist jedoch ein Kompilierungsfehler aufgetreten:

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

Dieser Fehler ist auf die Tatsache zurückzuführen, dass die C-Klassenmitgliedsfunktion implizit ein „this“ enthält, das auf die aktuelle Klasse verweist Zeiger als ersten Parameter. Allerdings erwartet pthread_create() einen Standardfunktionszeiger, der keinen this-Zeiger hat. Daher kann der Compiler einen solchen Funktionszeiger nicht in den für pthread_create() erforderlichen Funktionstyp konvertieren.

Lösung

Um dieses Problem zu lösen, müssen wir einen alternativen Ansatz verfolgen, der es uns ermöglicht, Klassenmitgliedsfunktionen von pthread_create() aus aufzurufen. Es gibt zwei gängige Ansätze:

Verwendung statischer Klassenmethoden

Statische Klassenmethoden enthalten diese Zeiger nicht, da sie keiner bestimmten Klasseninstanz zugeordnet sind. Sie kann wie eine normale Funktion wie folgt aufgerufen werden:

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

Wrapper-Funktionen verwenden

Eine andere Möglichkeit besteht darin, eine Klassenmitgliedsfunktion zu erstellen, die als normaler Funktions-Wrapper verpackt ist Funktion. Diese Wrapper-Funktion akzeptiert eine Klasseninstanz als erstes Argument und ruft die Member-Funktion wie folgt auf:

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

Das obige ist der detaillierte Inhalt vonWie kann ich eine Member-Funktion der C-Klasse an pthread_create() übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn