Thread Denksperre



  • Hi,
    Bin gerade an ner Klasse die Thread nutzt nur hab ihc gerade ne Denksperre warum das nicht funktioniert.
    Code:

    class myclass {
    private:
    static void* helpfunv(void* arg) {
    myclass *thisthread;
    thisthread = (myclass*) arg;
    return thisthread->funv;
    }
    void* funv() {
    //mach was;
    }
    public:
    void diefuncv() {
    pthread_t t1;
    pthread_create(&t1,0,&helpfunv,this);
    }
    };
    

    Dabie bekomme ich die Meldung das helpfunv nicht deklariert werden kann ohne eine statische Bindung zu haben, wie kann ich das beheben?

    MFG ReduX



  • gib mal bitte die compilerausgabe

    blan



  • Zeile 6 willst du ja die funktion aufrufen. Also fehlen die Klammern.

    Zeile 14, um den Zeiger auf eine Funktion zu bekommen bedarf es kein &.



  • Und die Funktion, die an pthread_create übergeben wird, darf nicht Teil einer Klasse sein. Sie muss freistehend extern "C" sein.



  • Ponto schrieb:

    Und die Funktion, die an pthread_create übergeben wird, darf nicht Teil einer Klasse sein. Sie muss freistehend extern "C" sein.

    Wo findet man eine Erklaerung dazu warum das so sein muss? Ist fuer mich nicht so wirklich logisch.



  • freda schrieb:

    Ponto schrieb:

    Und die Funktion, die an pthread_create übergeben wird, darf nicht Teil einer Klasse sein. Sie muss freistehend extern "C" sein.

    Wo findet man eine Erklaerung dazu warum das so sein muss? Ist fuer mich nicht so wirklich logisch.

    Weil die C++ und die C Funktionsaufrufkonventionen nicht identisch sein müssen. Pthreads ist aber eine C Bibliothek und weiss nichts von C++.

    Ein Link:
    http://www.lambdacs.com/cpt/FAQ.html#Q356

    Ansonsten such nach extern "C" in der Gruppe comp.programming.threads.



  • Hi,
    Danke für eure Antworten.
    Ich könne ja eine Funktion auserhalb der Klasse deklarieren die dann die Classen Funktion aufruft, jedoch kann doch dann der Benutzer der dann meine Lib nutzt auch auf die außerhalb deklarierte Funktion zugreifen. Ich möchte aber gern das er wies in C++ gemäß ist nur auf die Public FUnktionen der Klasse zugreifen kann.

    MFG Redux



  • Nabend,

    ReduX schrieb:

    Hi,
    Danke für eure Antworten.
    Ich könne ja eine Funktion auserhalb der Klasse deklarieren die dann die Classen Funktion aufruft, jedoch kann doch dann der Benutzer der dann meine Lib nutzt auch auf die außerhalb deklarierte Funktion zugreifen. Ich möchte aber gern das er wies in C++ gemäß ist nur auf die Public FUnktionen der Klasse zugreifen kann.

    MFG Redux

    dann pack die Funktion in einen anonymen Namespace. Dann ist sie durch den
    file scope limitiert.

    gruss
    v R



  • HI,
    Leider FUnktioniert es immer noch nicht.
    Ich habe es jetzt so:

    class myclass {
    private:
    void run();
    public:
    void intalizerun() {
    //pthread und übergibt this adresse
    }
    };
    //anonymer namespace
    namepsace {
    void* helprun(void* arg) {
    myclass* pThis;
    pThis = (myclass*)arg;
    return pThis->run();
    }
    

    Nun bekomme ich aber die meldung das run privat ist.
    Aber ich bin mit der Adresse doch praktisch wieder in der Klasse und dann kann ich doch wieder private aufrufen?!?!?!

    MFG ReduX



  • Dann mach die public.



  • @ReduX:

    meinen Post gelesen.



  • lagalopex schrieb:

    @ReduX:

    meinen Post gelesen.

    Er wollte aber die anderen Fehler korrigieren.



  • Du kannst alternativ ein Zwischenobjekt erzeugen:

    // .H Datei
    class Thread {
    public:
    
    private:
       void run();
    
       friend class ThreadStarter;
    };
    
    // .C Datei
    
    class ThreadStarter {
    public:
       ThreadStarter(Thread * thread)
        : _thread(thread) 
       {}
    
       void start();
    
       void run() {
          _thread->run();
       }
    private:
       Thread * _thread;
    };
    
    namespace {
      extern "C" {
        static void * thread_start_function(void * obj) {
          ThreadStarter * thread = static_cast<ThreadStarter *>(obj);
          try {
            thread->run();
          } catch (...) {
            // Irgendwas
          }
          return 0;
        }
      }
    }
    

Log in to reply