🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #12492

pthreads geeft geheugen precies niet vrij...

#12492
From: Benjamin Teugels
Date: Wed, 07 Nov 2001 22:08
80 lines
3678 bytes
Hey,

Ik zit met een raar probleem eigenlijk.  Ik heb hier een klein
testprogrammaatje gemaakt dat gebruikt maakt van de POSIX Threads.

Dit programma loopt in een oneindige lus waarin hij telkens om de vijf
seconden tien threads aanmaakt.  Geen nood, dit is opzettellijk gedaan. :-)

Als de threads worden aangemaakt, krijgen ze als argument de functie
(function) mee, waarmee de thread moet starten, en een pointer naar een
object (zijnde het argument van de functie) in dit geval een structure met
enkel een array van 4K characters.

Nu, om het gebruikte geheugen van het object vrij te geven waar de pointer
naar verwijst, _moet_ je dit doen in de functie zelf, vermits je ni weet
wanneer de functie/thread zal eindigen.  Daarmee doe ik dit ook in mijn code
met de statements "delete my_structure; my_structure = NULL".  Dit staat op
zowat elke site op het net die handelt over POSIX threads.  Als je dit
programma echter effe laat lopen onder Linux/BSD, zie je als je het proces
in het oog houdt dat het geheugen constant blijft stijgen met exact 10 x 4K
om de 5 seconden...

Onder Linux staan er altijd 2 processen van dit programma in de lijst, onder
OpenBSD maar eentje.  Doch is het geheugengedrag op beide systemen
hetzelfde, het blijft steeds meer geheugen innemen.

Nu is mijn vraag, is dit normaal?

Gezien het programma een daemon zal worden is het niet de bedoeling dat dit
na enige tijd gewoon al geheugen zal innemen :)

Is er iemand die me hierbij kan helpen?  Alvast bedankt op voorhand...

**************************************************
Linux :             $ g++ -o test test.cc -lpthread
OpenBSD :     $ g++ -o test test.cc -lthread
**************************************************

#include <string>
#include <unistd.h>
#include <stdio.h>

typedef struct my_struct
{
        char array[4096];
};

extern "C" void * function(void * _args)
{
    my_struct * my_structure = (my_struct *) _args;
    delete my_structure;
    my_structure = NULL;
    pthread_exit(NULL);
}

int main(int argc, char ** argv)
{
    bool flag = true;
    while (true)
    {
         if (flag)
        {
            pthread_t threads[10];
            for (int i = 0; i < 10; i ++)
            {
                my_struct * my_structure = new my_struct();
                strncpy(my_structure->array, "This is a string.", 17);
                pthread_create(&threads[i], NULL, function, (void *)
my_structure);
            }
            flag = false;
        }
        else
        {
            flag = true;
            sleep(5);
        }
    }
    return 1;
}
Technical Details
Message-ID: <jhiG7.7246$XM4.198@afrodite.telenet-ops.be>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!newsfeed.direct.ca!look.ca!newsfeed.icl.net!newsfeeds.belnet.be!news.belnet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,1256e9d91274077e,start
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2001-11-07 14:08:15 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!supernews.com!newsfeed.direct.ca!look.ca!newsfeed.icl.net!newsfeeds.belnet.be!news.belnet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
From: "Benjamin Teugels" <benjamin.teugels@pandora.be>
Newsgroups: be.comp.programming
Subject: pthreads geeft geheugen precies niet vrij...
Lines: 82
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2600.0000
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
Message-ID: <jhiG7.7246$XM4.198@afrodite.telenet-ops.be>
Date: Wed, 07 Nov 2001 22:08:15 GMT
NNTP-Posting-Host: 213.224.130.16
X-Complaints-To: abuse@pandora.be
X-Trace: afrodite.telenet-ops.be 1005170895 213.224.130.16 (Wed, 07 Nov 2001 23:08:15 MET)
NNTP-Posting-Date: Wed, 07 Nov 2001 23:08:15 MET
Organization: Telenet Internet