2016-12-01 4 views
0

Ich habe den folgenden Code, der Core Dumped Fehler bekommt. Jede C-Instanz erstellt ihren eigenen Thread und wird dann ausgeführt. Ich denke, dass etwas mit der statischen Funktion und dem Klassenargument "count" nicht stimmt. Wenn ich den Code auf Kommentar, dass er druckt, tritt kein Fehler ..Segmentierungsfehler bei der Verwendung von Pthreads in Klasse

#include <iostream> 
    #include <pthread.h> 
    using namespace std; 

    class C { 
     public: 
     int count; 
     C(int c_): count(c_){} 
    public: 
     void *hello(void) 
     { 
      std::cout << "Hello, world!" <<std::endl; 
      std::cout<<count; // bug here!!! 
      return 0; 
     } 

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

     void run() { 

      pthread_t t; 
      pthread_create(&t, NULL, &C::hello_helper, NULL); 
     } 

    }; 

    int main() { 

    C c(2); 
    c.run(); 

    C c2(4); 
    c2.run(); 

    while(true); 

    return 0; 
    } 

Antwort

1

Entschieden, um eine Antwort zu schreiben. Sie haben hello_helper mit einem context von NULL aufgerufen, basierend darauf, wie Sie Ihren Thread erstellt haben. Mit C++ können Sie Elementfunktionen vollständig auf Null-Zeigern aufrufen, und es tritt kein Fehler auf, wenn nicht auf ein Elementelement zugegriffen wird.

In Ihrem Fall, indem Sie die Zeile zum Drucken count hinzufügen. Sie greifen jetzt auf eine Membervariable auf einen Nullzeiger zu, was ein großes Nein ist.

Hier ist ein Beispiel dafür, was man mit wurden wegzukommen:

#include <iostream> 
class Rebel 
{ 
    public: 
    void speak() 
    { 
     std::cout << "I DO WHAT I WANT!" << std::endl;   
    }  
}; 
int main() 
{ 
    void * bad_bad_ptr = NULL; 
    ((Rebel*)bad_bad_ptr)->speak(); 
} 

Ausgang:

I DO WHAT I WANT!

Durch Ihre pthread_create Aufruf Modifizieren des this Zeiger übergeben (dh pthread_create(&t, NULL, &C::hello_helper, this);, die Sie jetzt haben eine gültige Instanz für den Zugriff auf Member-Variablen am.

+0

mascoj du hast Recht, das Argument ist Zeiger auf eine Klasseninstanz, ich war schlampig an diesem Punkt. . – eral

-1

ich das Problem, indem man diesen Zeiger statt off NULL gelöst, während Threads zu erstellen. Ich denke, dass os den gleichen Thread zweimal im ersten Fall erstellt hat?

+1

Nein, Sie haben '' '' hallo_he gerufen lper'''' mit einem Kontext von '' '' 'NULL'''' ..... – mascoj

+0

Warum ist das wichtig? Wenn ich die Zählvariable nicht drucke, ist es in Ordnung. – eral

+0

Um diese Antwort nützlicher (und weniger downvote Köder) zu machen, empfehle ich, den Code, den Sie geändert haben, hinzuzufügen und zu erklären, wie dies Ihr Problem gelöst hat. – user4581301

Verwandte Themen