Threads und Objekt



  • Hi!

    Ich habe ein Objekt x mit mehreren Eigenschaften und stelle im Konstruktor von x mehrere Threads her (die Variable threads ist eine der Eigenschaften von x):

    rc = pthread_create(&threads[t], &attr, worker, NULL);
    

    In der Funktion worker möchte ich nun eine Funktion aus dem Objekt x aufrufen:

    void *worker(void* arg){
    x->do_work();
    }
    

    Wenn ich das Programm starte, bekomme ich, sobald in der die Funktion x->do_work eine Variable des Objekts x aufgerufen wird, einen Segmentation fault (Speicherzugriffsfehler). Warum? Wie muss ich die Funktion aufrufen, damit es klappt und könnte man nicht auch im Objekt x selbst die Thread-Funktion *worker unterbringen?

    Danke für die Hilfe!



  • rc = pthread_create(&threads[t], &attr, worker, NULL);
    

    wie ist worker definiert?

    ansonsten zeig mal deinen code, meine glasskugel zeigt wiedermal nur schneegestöber.



  • Lern erst mal programmieren und versuch nach nem 1 mal was mit Threads.



  • Ich weiß nicht genau wie du die Variable "x" in "worker()" festlegst. Wenn x einen gültigen Wert hat, dürfte hier kein Problem entstehen. So wie du es beschreibst deutet alles daraufhin, dass dies nicht der Fall ist.

    Du kannst versuchen, den "this" Zeiger dem startenden Thread als Argument zu übergeben:

    rc = pthread_create( &threads[t], &attr, worker, this );
    

    Angenommen deine Klasse heißt XYZ, dann kannst du den Zeiger im Thread ablesen:

    void *worker(void* arg)
    {
        XYZ * obj = (XYZ *)arg;
    
        obj->do_work();
        [ ... ]
    }
    


  • deklarie mal worker "static", muss der return typ "void*" sein? Zeig mal die ganze klasse..


Anmelden zum Antworten