Portál AbcLinuxu, 12. května 2024 06:16


Dotaz: pthread - použití/vysvětlení

3.12.2008 20:31 Radek
pthread - použití/vysvětlení
Přečteno: 582×
Odpovědět | Admin

zdravím ve spolek, snažím se trochu pochopit vícevláknové aplikace, zkoušel jsem i něco napsat, nicméně nechápu jednu věc (viz. příklad)

 

  1 #include <unistd.h>
  2 #include <pthread.h>
  3 #include <stdlib.h>
  4 #include <stdio.h>
  5 void *thread_func( void *vptr_args );
  6 int main( void ){
  7     int j;
  8     pthread_t thread;
  9     pthread_create( &thread, NULL,
 10             &thread_func, NULL );
 11     for( j= 0; j < 20; ++j ){
 12         fprintf( stdout, "a " );
 13         sleep(1);
 14     }
 15     pthread_join( thread, NULL );
 16     fprintf(stdout, "\n");
 17     exit( EXIT_SUCCESS );
 18 }
 19 void *thread_func( void *vptr_args ){
 20     int j;
 21     for( j= 0; j < 10; ++j ){
 22         fprintf( stderr, " b " );
 23         sleep(4);
 24     }
 25     return NULL;
 26 }
 

pokud zadam časy sleep(time) delší, pak mi vypise a b a b ..., ale pokud jsou časy krátké, pak to nejdříve vypíše thread_function a poté najednou main.

Chtěl bych vysvětlit proč, předpokládal jsem, že to jaksi pojede oboje najednou, i kdyby tam žádný sleep nebyl. Chápu, že na jednoprocesorovém počítači se vykonává jedna věc v daném čase, ale nicméně, bych předpokládal, že systém na určitou dobu přidělí čas jednomu vláknu a pak druhému, a tudíž se budou střídat..

díky

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

3.12.2008 20:50 johniez | skóre: 17 | blog: xyz | Praha
Rozbalit Rozbalit vše Re: pthread - použití/vysvětlení
Odpovědět | | Sbalit | Link | Blokovat | Admin

Nehraje tam nějakou roli to, že je výstup bufferován?

3.12.2008 21:08 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: pthread - použití/vysvětlení
Navyše jedno má výstup do stdout a druhé do stderr.
3.12.2008 21:18 Radek
Rozbalit Rozbalit vše Re: pthread - použití/vysvětlení
Odpovědět | | Sbalit | Link | Blokovat | Admin

to mi nedoslo, ze je to zpusobeno tim bufferovanim...

takze kdyby ta fce ciste jen neco pocitala a v main fci by se take neco pocitalo, tak by to jelo opravdu oboje najednou  na dvou jadrovem procesoru? Nejsem si prave jist tim, jestli vlakna mohou jet opravdu na ruznych procesorech (jestli system umi kazdemu vlaknu pridelit jiny procesor) nebo je to az kdyz je aplikace viceprocesova napr. pomoci fork.

3.12.2008 22:31 johniez | skóre: 17 | blog: xyz | Praha
Rozbalit Rozbalit vše Re: pthread - použití/vysvětlení

Vlákna na úrovni jádra OS můžou jet na více procesorech.

Bluebear avatar 3.12.2008 23:07 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: pthread - použití/vysvětlení
Odpovědět | | Sbalit | Link | Blokovat | Admin

Nevím, jestli je to tak úmyslně, ale v thread_func() píšeš do stderr, zatímco v main() píšeš do stdout. Stdout používá buffering, zatímco stderr ne; tipoval bych, že aspoň část problému bude tady.

To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
Bluebear avatar 3.12.2008 23:07 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: pthread - použití/vysvětlení

Pozdě :-(

To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.