Fandt en løsning... Dvs. en klassekammerat der ved en masse om linux kom
frem til at tråde allokerer 8mb stak. Da der kun må addreseres 2gb
adresserum, kan man ikke starte mere end 256 tråde. Løsningen er at
adressere mindre stak pr tråd:
#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,
treadfunction, 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;
}
Her sættes stakkens adresserum til 500KB. Det er vigtigt at bemærke at der
ikke allokeres al den hukommelse som tråden potientielt bruger til sin stak,
men blot reserveres adresserum til det. Ellers ville applikationen kræve
forbandet meget ram
mvh.
Kasper (som godt ved at der næppe er nogen der støder på samme problem
foreløbi... men nu kan de læse løsningen hvis de gør)
"Jesper Louis Andersen" <jlouis@miracle.mongers.org> wrote in message
news:rkl5d2-s43.ln1@miracle.mongers.org...
> Kasper Birch Olsen <kasper@nospam.com> wrote:
>
>> Jeg har et stort problem med antallet af tr?de i et program. N?r jeg
>> runder
>> omkring 250 k?rende tr?de (dont even ask), s? g?r skidtet ned. Jeg koder
>> C
>> p? en redhat linux box, og jeg aner ikke om problemet er relateret til C
>> eller linux. Fejlen er "Cannot Allocate Memory" hvilket jeg kunne
>> forestille
>> mig betyder at der ikke er mere plads p? hob eller stak til flere
>> tr?de/deres data. Er det muligt at lave nogle numre ala allocere
>> hukommelse
>> og sige til tr?den at den skal bruge det som hob eller s?dan noget? Eller
>> kan man m?ske compilere programmet med et flag der f?r det til at udbede
>> en
>> enorm hob/stak?
>
> mansider:
>
> malloc(3), getrlimit(2), setrlimit(2), sigaltstack(2)??, ulimit(3)
>
> Det kunne ogsaa vaere en threading-graense paa 2^8 threads, etc. Du er
> bare noedt til at lede noget mere.
>
> --
> jlouis