Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
ivstojic Forumaš(ica)
Pridružen/a: 20. 03. 2007. (08:52:16) Postovi: (23)16
|
Postano: 14:08 čet, 13. 10. 2011 Naslov: Primjer sa demonstratura |
|
|
Kod sa današnjih demonstratura.
Kod sa današnjih demonstratura.
Description: |
|
Download |
Filename: |
barr.c |
Filesize: |
2.39 KB |
Downloaded: |
177 Time(s) |
|
|
[Vrh] |
|
Cobs Forumaš(ica)
Pridružen/a: 21. 01. 2008. (13:32:15) Postovi: (206)16
Spol:
Lokacija: Geto
|
Postano: 18:42 pet, 14. 10. 2011 Naslov: |
|
|
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] |
|
ivstojic Forumaš(ica)
Pridružen/a: 20. 03. 2007. (08:52:16) Postovi: (23)16
|
|
[Vrh] |
|
Cobs Forumaš(ica)
Pridružen/a: 21. 01. 2008. (13:32:15) Postovi: (206)16
Spol:
Lokacija: Geto
|
Postano: 21:54 ned, 16. 10. 2011 Naslov: |
|
|
[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] |
|
ivstojic Forumaš(ica)
Pridružen/a: 20. 03. 2007. (08:52:16) Postovi: (23)16
|
|
[Vrh] |
|
|