Heim >Backend-Entwicklung >C++ >Wie kann ich C-Klassen-Memberfunktionen in pthreads verwenden?

Wie kann ich C-Klassen-Memberfunktionen in pthreads verwenden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-23 04:29:20332Durchsuche

How Can I Use C   Class Member Functions in pthreads?

Klassenmitgliedsfunktionen in Threads integrieren

In C tragen Klassenmitgliedsfunktionen von Natur aus einen versteckten Parameter namens „this“. Dies stellt eine Herausforderung dar, wenn versucht wird, Threads mithilfe von Mitgliedsfunktionen zu erstellen, da die Funktion pthread_create() der Standardbibliothek einen Funktionszeiger ohne solche Parameter erwartet.

Kompilierungsfehler: Funktionszeiger konnte nicht konvertiert werden

Wie der erste Codeausschnitt zeigt, führt der Versuch, eine Klassenmitgliedsfunktion an pthread_create() zu übergeben, direkt zu einer Kompilierung Fehler:

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

Der Compiler beschwert sich, dass er den Mitgliedsfunktionszeiger (void* (tree_item::*)(void*)) nicht in den erwarteten Funktionszeigertyp (void* (*)(void) konvertieren kann *)).

Lösung: Statische Klassenmethode oder unabhängige Funktion

Um dieses Problem zu umgehen, gibt es zwei praktikable Ansätze:

  1. Statische Klassenmethode:
    Definieren Sie eine statische Klassenmethode (die keinen „this“-Zeiger akzeptiert), die die gewünschte Funktionalität kapselt:

    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. Unabhängig Funktion:
    Erstellen Sie eine separate Funktion, die als Wrapper um die Klassenmitgliedsfunktion dient, und übergeben Sie dabei explizit den „this“-Zeiger als Argument:

    void hello_wrapper(void *context)
    {
        C *object = (C *)context;
        object->print();
    }

Thread-Erstellung mit statischer Klassenmethode oder Wrapper-Funktion

Mit jedem dieser Ansätze können Sie jetzt verwenden pthread_create() zum Erstellen von Threads, die die gewünschten Klassenmitgliedsfunktionen ausführen:

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

Das obige ist der detaillierte Inhalt vonWie kann ich C-Klassen-Memberfunktionen in pthreads verwenden?. 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