Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Primjer sa demonstratura

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Paralelni algoritmi 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
ivstojic
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 20. 03. 2007. (08:52:16)
Postovi: (23)16
Sarma = la pohva - posuda
13 = 13 - 0

PostPostano: 14:08 čet, 13. 10. 2011    Naslov: Primjer sa demonstratura Citirajte i odgovorite

Kod sa današnjih demonstratura.
Kod sa današnjih demonstratura.





barr.c
 Description:

Download
 Filename:  barr.c
 Filesize:  2.39 KB
 Downloaded:  170 Time(s)

[Vrh]
Korisnički profil Pošaljite privatnu poruku
Cobs
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 21. 01. 2008. (13:32:15)
Postovi: (206)16
Spol: muško
Sarma = la pohva - posuda
26 = 40 - 14
Lokacija: Geto

PostPostano: 18:42 pet, 14. 10. 2011    Naslov: Citirajte i odgovorite

može pitanje vezano uz primjer sa stranice: https://computing.llnl.gov/tutorials/pthreads/
prvi kod po kojem se radi ( znači funkcije pthread_create i pthread_exit )

jasno mi je sve do:

[code:1]int rc;
long t;

for(t=0; t<NUM_THREADS; t++)
{
printf("Creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);
...
}
[/code:1]

Zašto ovo ne radi kako treba, tj. castamo u void*, trebali bi poslati adresu varijable, konkretno u primjeru prije šaljemo strukturu u thread ( i to naravno cast ide preko adrese ), dok za varijablu long u ovom slučaju to ne radi, tamo piše da se radi o shared memory, no ne kužim kakve to konkretne veze ima sa tim?
A kada u prvom primjeru radimo ovakav cast: long -> void* -> long, to ne da prolazi kompajliranje, nego i čuva vrijednost u long.
može pitanje vezano uz primjer sa stranice: https://computing.llnl.gov/tutorials/pthreads/
prvi kod po kojem se radi ( znači funkcije pthread_create i pthread_exit )

jasno mi je sve do:

Kod:
int rc;
long t;

for(t=0; t<NUM_THREADS; t++)
{
   printf("Creating thread %ld\n", t);
   rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);
   ...
}


Zašto ovo ne radi kako treba, tj. castamo u void*, trebali bi poslati adresu varijable, konkretno u primjeru prije šaljemo strukturu u thread ( i to naravno cast ide preko adrese ), dok za varijablu long u ovom slučaju to ne radi, tamo piše da se radi o shared memory, no ne kužim kakve to konkretne veze ima sa tim?
A kada u prvom primjeru radimo ovakav cast: long → void* → long, to ne da prolazi kompajliranje, nego i čuva vrijednost u long.


[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
ivstojic
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 20. 03. 2007. (08:52:16)
Postovi: (23)16
Sarma = la pohva - posuda
13 = 13 - 0

PostPostano: 19:30 pet, 14. 10. 2011    Naslov: Citirajte i odgovorite

U kodu iz tvog posta ce svi threadovi dobiti pointere na istu (jednu jedinu) varijablu [b]t[/b], tako da svi vide tu istu varijablu kad dereferenciraju svoj pointer.


U primjeru sa strukturom sa pocetka topica svakom threadu se salje pointer na drugu strukturu (tj svaki thread ima pointer na svoju strukturu).


Ovaj primjer gdje se [b]long t[/b] casta u [b]void*[/b] pa opet u [b]long[/b] radi zbog toga sto ovime "prisilimo" C da u sam pointer upise broj iz [b]t[/b] umjesto adrese koja se normalno upisuje u pointere, pa zatim kad to opet castamo u [b]long[/b] dobijemo natrag taj broj.

Kod nije dobar jer ovisi o velicinama od [b]long[/b] i [b]void*[/b] -- dobro radi samo ako [b]t[/b] stane u memoriju koju zauzima jedan pointer. Na primjer ako su [b]long[/b] i [b]void*[/b] oba veliki 4 bajta to će raditi, ali na sustavu na kojem je [b]long[/b] veci od [b]void*[/b] ovo nece pouzdano raditi.
U kodu iz tvog posta ce svi threadovi dobiti pointere na istu (jednu jedinu) varijablu t, tako da svi vide tu istu varijablu kad dereferenciraju svoj pointer.


U primjeru sa strukturom sa pocetka topica svakom threadu se salje pointer na drugu strukturu (tj svaki thread ima pointer na svoju strukturu).


Ovaj primjer gdje se long t casta u void* pa opet u long radi zbog toga sto ovime "prisilimo" C da u sam pointer upise broj iz t umjesto adrese koja se normalno upisuje u pointere, pa zatim kad to opet castamo u long dobijemo natrag taj broj.

Kod nije dobar jer ovisi o velicinama od long i void* – dobro radi samo ako t stane u memoriju koju zauzima jedan pointer. Na primjer ako su long i void* oba veliki 4 bajta to će raditi, ali na sustavu na kojem je long veci od void* ovo nece pouzdano raditi.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Cobs
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 21. 01. 2008. (13:32:15)
Postovi: (206)16
Spol: muško
Sarma = la pohva - posuda
26 = 40 - 14
Lokacija: Geto

PostPostano: 21:54 ned, 16. 10. 2011    Naslov: Citirajte i odgovorite

[quote="ivstojic"]U kodu iz tvog posta ce svi threadovi dobiti pointere na istu (jednu jedinu) varijablu [b]t[/b], tako da svi vide tu istu varijablu kad dereferenciraju svoj pointer.[/quote]

Ok, e sad mene samo zanima zašto mi tu onda ispisuje neki čudan broj ( vjerojatno adresu varijable ), a ne vrijednost varijable, makar je možda i kriva.
Kolko sam shvatio, recimo da jedna dretva dobije pravo na izvršavanje i ona se izvrši do pola, te se sad druga krene izvršavati, no ta varijabla t nije onakva kakva bi trebala biti u toj dretvi ( znači konkretno ima vrijednost koja bi trebala biti u nekoj drugoj dretvi ) i tu dolazi do komplikacija ( jer sve dretve gledaju na adresu iste varijable ). Zašto onda dobivam taj čudan broj a ne vrijednost od t makar i krivu vrijednost ( znači 'relativno' krivu jer ne pripada toj dretvi koja je koristi )

Primjer: ( ponekad prođe, ponekad se vidi greška )

[code:1]#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 10

void *PrintHello(void *threadid)
{
long *tid;
tid = (long*)threadid;
printf("Hello World! It's me, thread #%ld!\n", *tid);
pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0; t<NUM_THREADS; t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)&t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
}[/code:1]
ivstojic (napisa):
U kodu iz tvog posta ce svi threadovi dobiti pointere na istu (jednu jedinu) varijablu t, tako da svi vide tu istu varijablu kad dereferenciraju svoj pointer.


Ok, e sad mene samo zanima zašto mi tu onda ispisuje neki čudan broj ( vjerojatno adresu varijable ), a ne vrijednost varijable, makar je možda i kriva.
Kolko sam shvatio, recimo da jedna dretva dobije pravo na izvršavanje i ona se izvrši do pola, te se sad druga krene izvršavati, no ta varijabla t nije onakva kakva bi trebala biti u toj dretvi ( znači konkretno ima vrijednost koja bi trebala biti u nekoj drugoj dretvi ) i tu dolazi do komplikacija ( jer sve dretve gledaju na adresu iste varijable ). Zašto onda dobivam taj čudan broj a ne vrijednost od t makar i krivu vrijednost ( znači 'relativno' krivu jer ne pripada toj dretvi koja je koristi )

Primjer: ( ponekad prođe, ponekad se vidi greška )

Kod:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS     10

void *PrintHello(void *threadid)
{
   long *tid;
   tid = (long*)threadid;
   printf("Hello World! It's me, thread #%ld!\n", *tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)&t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL); 
}


[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
ivstojic
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 20. 03. 2007. (08:52:16)
Postovi: (23)16
Sarma = la pohva - posuda
13 = 13 - 0

PostPostano: 15:49 pon, 17. 10. 2011    Naslov: Citirajte i odgovorite

U ovom programu [b]main[/b] može završiti prije nego se izvrše pojedini threadovi.

Kada [b]main[/b] završi dealocira se varijabla [b]t[/b] pa se memorijska lokacija te varijable može iskoristiti za nešto drugo, što onda preko svog pointera vide (i ispišu) threadovi koji još nisu završili (točnije, oni koji još nisu došli do [b]printf[/b]).
U ovom programu main može završiti prije nego se izvrše pojedini threadovi.

Kada main završi dealocira se varijabla t pa se memorijska lokacija te varijable može iskoristiti za nešto drugo, što onda preko svog pointera vide (i ispišu) threadovi koji još nisu završili (točnije, oni koji još nisu došli do printf).


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Paralelni algoritmi 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan