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