Avatar billede m_bold Praktikant
01. februar 2005 - 11:16 Der er 4 kommentarer og
1 løsning

cannot allocate memory

Hejsa.

Jeg sidder og roder med en masse tråde i C i Linux, men efter jeg har oprettet omkring 250 tråde får jeg fejlen "cannot allocate memory"...

Hvordan kan man afsætte mere plads i hukommelsen til at gøre dette?
Avatar billede bertelbrander Novice
01. februar 2005 - 20:15 #1
Det er ikke usansynligt at der er en øvre grænse for hvormange tråde du kan lave på din Linux. Det er nok ikke så meget et spørgsmål om en begrænsning i memory, men mere en begrænsning i Linux og eller gcc.
Hvis du virkelig har brug for at lave mere end 250 tråde skal du sansynligvis rekompilere din linux kerne med en større limit.
Avatar billede m_bold Praktikant
01. februar 2005 - 20:35 #2
ok. Det virker ikke som om du er helt sikker. Jeg ville være ked af at rekompilere min linux-kerne hvis jeg ikke får den ønskede effekt.

Men hvis det er noget du er sikker på, kan du så ikke lige give mig et link til en side, hvor fremgangsmåden er beskrevet....?
Avatar billede bertelbrander Novice
01. februar 2005 - 21:06 #3
Jeg er ret sikker på at der er en grænse, jeg ved ikke om den er ved 250 eller 500 eller ...

Jeg er også ret sikker på at du kan ændre denne grænse ved at rekompilere din kerne (og måske også lib-gcc).
Men jeg ved ikke hvordan, det afhænger nok også af hvilken Linux du har.

Prøv at søge på f.ex. "Max number of threads" på google, du er ikke den første med det problem.
Avatar billede m_bold Praktikant
04. februar 2005 - 12:02 #4
Right. Jeg har fået oplyst en lidt lettere løsning via mit studie. Den virker mere overskuelig. Lægger den lige op her:

Det lader til, at Linux som standart har en stack størrelse på 8MB og det gælder også for tråde:

[tlb@localhost tlb]$ zsh
tlb@localhost ~ $ limit
cputime        unlimited
filesize        unlimited
datasize        unlimited
>>>stacksize      8MB
coredumpsize    0kB
memoryuse      unlimited
maxproc        4093
descriptors    1024
memorylocked    unlimited
addressspace    unlimited
maxfilelocks    unlimited

8MB * 256 svarer fint overens med de 2GB addressspace som vist er std på
kerne 2.6, 8MB er dog nok lidt i overkanten af hvad jeg har behov for, så jeg kan godt sætte den ned til noget mindre, fx. 0.5MB.

#define NTHREAD 10000
#define STACKSIZE (0.5*1024*1024)

int main(int argc, char *argv[])
{
    printf("Start:\n");
    pthread_t thread[NTHREAD];

    /* Set some limits on the stack size, so we don't use the default of
8MB */
    pthread_attr_t stack_size_custom_attr;
    pthread_attr_init(&stack_size_custom_attr);
    pthread_attr_setstacksize(&stack_size_custom_attr, STACKSIZE);
   
    int i = 0;
    int res = 0;
   
    for(i=0;i<NTHREAD;i++) {
        res = pthread_create(&thread[i], &stack_size_custom_attr, test,
NULL);
        if(res != 0) {   
            printf("On Thread: %i\n", i);
            perror("Could not create thread");
            exit(EXIT_FAILURE);   
        }
    }
   
    for(i=0;i<NTHREAD;i++) {
        res = pthread_join(thread[i], (void **)NULL);
    }
   
    printf("Stop:\n");
    return 0;   
}

Dermed bliver der afsat mindre plads pr. tråd men mere plads til antallet af tråde. Det har hjulpet mig videre...
Avatar billede m_bold Praktikant
05. februar 2005 - 23:43 #5
lukker spørgsmålet...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester