SUMMARY: pthread free() weirdness with cxx

From: Michael Haller <Michael.Haller_at_uk.lionbioscience.com>
Date: Mon, 30 Apr 2001 09:46:27 +0100

Better late then never...

Original question follows. Thanks to Thomas Blinn
and John Reguera.

Hi Michael,
  We believe that we have a resolution for you.

What was happening with your reproducer is:

the application allocates approx 50,000 items of approx,
the same size, then free's every other element - which resulted
in a free list of 25k elements.

What malloc/libc does, and it seems to work in "most cases"
is create a singly linked list

Luckily, libc/malloc engineering had the wisdom to allow the end
user to implement a doubly linked list. This will solve your
performace
issue.

Please add the following line of code to your source:

const extern int __fast_free_max = 14;

If this is an unacceptable solution, Please feel free to open an
IPMT case through your normal support channels against
LIBC/Malloc.


thanks

John Reguera
DecThreads Support Engineering
************************************************

--------------- <ORIGINAL QUERY> -----------------------------

Hi,

System is OSF1 V5.1 732 alpha.
Compaq C++ V6.2-024 for Compaq Tru64 UNIX V5.1 (Rev. 732)

There seems to be a strange problem with C++ programs
compiled with the -pthread flag.

Example program:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 24795
#define MALSIZE1 32
#define MALSIZE2 20

int main() {
    char *blah, *blah2;
    char *index[MAXSIZE], *index2[MAXSIZE];

    for (int k=0; k<MAXSIZE; k++) {
        static int bla;
        blah = new char[MALSIZE1];
        sprintf (blah, "bla%d", ++bla);
        index[k] = (char*) blah;
        blah2 = new char[MALSIZE1];
        sprintf (blah2, "bla%d", ++bla);
        index2[k] = (char*) blah2;
    }
    printf("blah\n");

    for (int k=0; k<MAXSIZE; k++) {
        delete [] index[k];
    }
    printf("blah 1\n");

    for (int k=0; k<MAXSIZE; k++) {
        delete [] index2[k];
    }
    printf("blah 2\n");
}


Runs very fast when compiled:

    cxx t.cc

and very slow (5 seconds) if compiled:

    cxx t.cc -pthread

Further tests....

1. If I move the second delete statement into the first
delete loop the execution speed is effectively the same with or
without the -pthread flag.

2. If I alloc MALSIZE2 into index2 and MALSIZE1 into index1
excution speed is effectively the same with or without the
-pthread flag...irrespective of where index2 is deleted.

Has this problem been seen before? Can anybody reproduce
it locally? Is there a solution?

Many thanks for any help or advice,

        - Michael
Received on Mon Apr 30 2001 - 08:44:30 NZST

This archive was generated by hypermail 2.4.0 : Wed Nov 08 2023 - 11:53:42 NZDT