Pthreads - prilis mnoho threadu?? (Delsi)
David Šauer
davids na orfinet.cz
Pátek Duben 30 14:43:13 CEST 1999
>>>> "Michal" == Michal Krause <mike na navrcholu.cz> writes:
Michal> Dne 30. 4. 1999 Dobes Jiri napsal:
>> Vytvoril jsem program pro vypocty, ktery pouziva pthready.
>> Program bezi chvili v pohode, ale po nejky dobe dalsi thready
>> uz nejdou vytvorit. Pritom jsem stare (doufam) zrusil.
Michal> Zkusil jsem to a normalne mi to funguje. Je fakt, ze neco jsem upravoval,
Michal> ale nic podstatneho:
>> #include <pthread.h>
>> #include <unistd.h>
>> #include <stdio.h>
>>
>> void * process(void *a) /* tohle je vypoctova cast */
>> { int i;
>> printf("Thread %d: start\n", (int *)a);
Michal> ^ tady chybi jedna hvezdicka
Myslím, že nechybí. Naopak bych rekl, ze je tam jedna navic, tedy ze
tam ma byt jen pretypovani na (int).
V konkretni implementaci to asi nevadi ... printf dostava cislo
"int" i ukazatel jako 32 bit číslo. "int*" i "int" má 32 bitů (alepoň na mém
PC) a tedy na nějakém přetypování nezáleží.
>> sleep(1); /* co jinyho by to mohlo delat? (a nezavisi to na tom) */
Michal> sleep() asi nepujde, protoze se dela pres signal a tudiz muze byt jenom
Michal> jeden najednou.
Hm, linuxthreads implementuji thready jako procesy a kazdy thread muze
mit vlastni masku signalu - tedy alespon myslim.
>> printf("Thread %d: end\n", (int *)a);
Michal> ^ opet chybi hvezdicka
viz. vyse
>> return NULL;}
>>
>> int main(){
>> int i,j,retcode;
>> pthread_t a;
>> void *retval;
>>
>> for(j=1;j<=1000;j++)
>> {for(i=1;i<=100;i++)
>> { retcode = pthread_create(&a, NULL, process, (void *) i);
Michal> tady chybi & ^
dtto. Vy byste chtel predavat adresu promenne, ale jde to i primo -
tedy int pretypovat na ukazatel a pozdeji zase ukazatel na
int. Uznavam, ze je vas zpusob je asi cistejsi, ale pro mala cisla (do 16-ti,
mozna 32 bitu) to asi pujde pouzit bez velkeho rizika - alespon pro
tento priklad.
>> Zkonci to:
>> Thread 32: start
>> create a failed 11 (i=34, j=11)
Michal> Ovsemi pres uvedene chyby by to melo fungovat (nebo spis padat na sigsegv,
Michal> ale nemelo by to koncit s chybou na pthread_create).
Myslim, ze to nema padat SIGSEGV.
>> Proc nejdou dalsi thready vytvorit? Po skonceni funkce by
>> se mel thread zlikvidovat. Na `ps` se zobrazi vzdy priblizne
>> odpovidajici pocet threadu.
Michal> To jest kolik? Pripadne se mrknete jaky je limit na maximalni pocet threadu
Michal> (PTHREAD_THREADS_MAX).
Michal> Poznamka: doporucuji kompilovat s -Wall, usetrite si tim hledani ruznych
Michal> hloupych chyb, jako jsou prave ty chybejici hvezdicky nebo ampersandy.
Take se ptam kolik. Vzledem k tomu, ze ten thread ceka jen 1s, je
mozne, ze dojde chybe, ale nez stacite vypsat procesy, tak uz ostatni
thready skonci.
Osobne si myslim, ze problem je prave v prilis velkem poctu threadu,
nebot jsem si ten kod 11 nechal vypsat:
[snip...]
Thread 1: end
Thread 2: end
Thread 3: end
Thread 31: start
Thread 4: end
Thread 5: end
Thread 6: end
Thread 32: start
create a failed 11 (i=33, j=11)
error: Resource temporarily unavailable
^^^^^^^^^^^^^^^^^^^ cili asi tech threadu bylo moc ...
Aborted
Thread 7: end
--
* David Sauer, student of Czech Technical University
* electronic mail: davids na orfinet.cz (mime compatible)
Další informace o konferenci Linux