pthread - Cannot allocate memory



  • Hallo,

    Mein Programm:

    Client - Server
    Client kann Anfragen an Server senden welcher in seinem Wörterbuch die gefragten Einträge an den Client zurück sendet.

    Der Server erstellt für jede Anfrage ein Thread welches jeweils 1 Client bedient.
    Soweit so gut. Doch nach ca. 380 Anfragen am Server gibt dieser den Geist auf mit der Fehlermeldung vom pthread_create: Cannot allocate memory.

    Was mich eigentlich wundert da die threads geschlossen werden mit pthread_exit(NULL).

    Mit ps -au kann man sehen dass der virtuelle Speicher(VSZ) proportional zu den Threads steigt(die eigentlich den Speicher nach beenden wieder freigeben 😕 ).
    Ich bin mit meinem Latein am Ende..
    Bitte helft mir 😞



  • Nun gut ich probiers mal in meiner Glaskugel 😉

    DaiweL schrieb:

    Doch nach ca. 380 Anfragen am Server gibt dieser den Geist auf mit der Fehlermeldung vom pthread_create: Cannot allocate memory.

    Was sagt "ulimit -a" ?

    DaiweL schrieb:

    Was mich eigentlich wundert da die threads geschlossen werden mit pthread_exit(NULL).

    Ja na und? Wo allokierst du denn den Speicher? Der Heap liegt im gemeinsamen Kontext und wird nicht durch das Beenden eines Threads wieder deallokiert.

    DaiweL schrieb:

    Mit ps -au kann man sehen dass der virtuelle Speicher(VSZ) proportional zu den Threads steigt(die eigentlich den Speicher nach beenden wieder freigeben 😕 ).

    Das ist ein "normales" Verhalten. Free() gibt den Speicher für neue Allokierungen wieder frei, aber es deallokiert ihn nicht, so daß du ihn nicht mehr mit "ps -au" siehst.

    Du dürftest auch den Free Memory immer mehr gegen 0 gehen sehen, aber deswegen ist noch lange nicht all der Memory verbraucht. Stichwort Freelists und Speicherverwaltung vom OS.

    Ein bissl Code wäre schön 🕶



  • Hmm also ulimit -a gibt:

    core file size (blocks, -c) 0
    data seg size (kbytes, -d) unlimited
    max nice (-e) 20
    file size (blocks, -f) unlimited
    pending signals (-i) unlimited
    max locked memory (kbytes, -l) unlimited
    max memory size (kbytes, -m) unlimited
    open files (-n) 1024
    pipe size (512 bytes, -p) 8
    POSIX message queues (bytes, -q) unlimited
    max rt priority (-r) unlimited
    stack size (kbytes, -s) 8192
    cpu time (seconds, -t) unlimited
    max user processes (-u) unlimited
    virtual memory (kbytes, -v) unlimited
    file locks (-x) unlimited

    Also meiner Meinung nach ziemlich unbegrenzt.

    Doch was stopft den Speicher voll wenn die Threads sich beenden?



  • DaiweL schrieb:

    Also meiner Meinung nach ziemlich unbegrenzt.

    Richtig, bist auf den Stack 😉

    DaiweL schrieb:

    Doch was stopft den Speicher voll wenn die Threads sich beenden?

    Na ein malloc innerhalb der Threads, da der Speicher nach dem Beenden eines Threads nicht automatisch freigegeben wird.

    DaiweL schrieb:

    Hier mein Code.. etwas durcheinander geraten durch das viele rumprobieren...

    Den Code kannst du ohne Fehler übersetzen... da sehe ich ja mit bloßem Auge "{}" bei der for-schleife in der funktion "trait_demande".



  • ok nun hab ich alle malloc's und free's rausgenommen, un das ganze statisch gemacht, doch noch immer gibt es eine ca. 380'er grenze *Heul*



  • Hiiiilfe 😞 Wieso verweilen geschlossenen Threads denn noch auf dem Heap?



  • Wenn du nicht mit pthread_join() auf den Thread wartest, solltest du pthread_detach() aufrufen. Somit wird der Exit Status, nach der Terminierung des Threads, nicht aufbewahrt.



  • Dannnnke 😃 genau das hat das Problem gelöst!!!! 😃 😃 😃


Anmelden zum Antworten