/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
tråde... mange tråde
Fra : Kasper Birch Olsen


Dato : 01-02-05 21:20

Hej NG

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?

Any help appriciated :)

- Kasper



 
 
Jesper Louis Anderse~ (02-02-2005)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 02-02-05 02:06

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

Kasper Birch Olsen (04-02-2005)
Kommentar
Fra : Kasper Birch Olsen


Dato : 04-02-05 16:00

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



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste