pthreads und statische Methoden



  • Hi Leute,

    ich bin gerade dabei den Server einer klassischen Client-Server Applikation zu modellieren. Der Server lauscht an einem Port und für jede eingehende Verbindung soll ein Thread gestartet werden, der den Client bedient.

    Der Thread startet in einer Methode einer Klasse. Damit das mit den pthreads funktioniert, muss diese natürlich statisch sein. Und eventuell erkennt ihr jetzt schon mein Dilemma: wenn diese Methode statisch ist, existiert kein Objekt beim Threadstart. Aber ich benötige dieses Objekt um richtig arbeiten zu können.

    Lege ich das Objekt im Mainthread an und übergebe es, hätte ich ein Speicherleck. Denn der Mainthread kümmert sich ja um die "acceptLoop" und ihm sollte es egal sein ob sich ein anderer Thread beendet...

    Hoffe ihr versteht mich und könnt mir Tipps zur Lösung geben.

    Danke schonmal!



  • Du kannst das Objekt doch vom Hauptthread anlegen lassen, an den Thread übergeben und vom Thread löschen lassen (wenn er sich beendet).



  • Naja, wenn der Mainthread das Objekt anlegt, muss dieser auch das Objekt löschen. Denn ein Objekt kann ja nicht selber seinen eigenen Destruktor aufrufen.
    Desweiteren sollte sich der Mainthread nur um das Annehmen der Verbindungen kümmern, und nicht um irgendwelche Objekte.

    Eventuell schreibe ich mir einen "Collector-Thread", der sich um die Verwaltung der Objekte kümmert. Der könnte dann alle paar Sekunden nachsehen ob die Threads noch laufen und ob Objekte zerstört werden müssen.

    Nicht gerade die schönste Lösung, aber eine Möglichkeit wäre es...



  • statische Methoden sind nicht erlaubt. Es muss schon eine freistehende extern "C" Methode sein.

    Siehe zum Beispiel: http://www.lambdacs.com/cpt/FAQ.html#Q356



  • Tobias W schrieb:

    Naja, wenn der Mainthread das Objekt anlegt, muss dieser auch das Objekt löschen. Denn ein Objekt kann ja nicht selber seinen eigenen Destruktor aufrufen.
    Desweiteren sollte sich der Mainthread nur um das Annehmen der Verbindungen kümmern, und nicht um irgendwelche Objekte.

    Eventuell schreibe ich mir einen "Collector-Thread", der sich um die Verwaltung der Objekte kümmert. Der könnte dann alle paar Sekunden nachsehen ob die Threads noch laufen und ob Objekte zerstört werden müssen.

    Nicht gerade die schönste Lösung, aber eine Möglichkeit wäre es...

    Ich meinte sowas

    // pseudocode
    // main-thread:
    Object* object = new Object();
    pthread_create(...,thread_function,object,...);

    thread_function(void* x)
    {
    Object* object = (Object*)x;
    ...
    delete object;
    }



  • Note that one thread per connection is a terrible way of building server software



  • @ihoernchen:
    Stimmt, sollte eigentlich funktionieren. Weiß nicht warum ich über 10 Ecken gedacht habe...

    @note:
    So what would you suggest? What is the usual way? Its my first server application and it would be nice if you have some tips for me.



  • using man: epoll is the suggested way under linux. if you want it portable use a library like libevent



  • Never heard of epoll yet, but sounds to fit for my problem mostly perfect.
    Thanks for that hint!



  • Ich würde eher die Bibliothek Boost Asio verwenden, das andere ist doch viel zu Low-Level.


Anmelden zum Antworten