|
|
|
![]() |
|
Strumenti |
![]() |
#1 | |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
[C] errore che non riesco a trovare - thread
salve, in questo semplice programma, c'è un errore (infatti il programma mi va in segmentation fault, ma non riesco proprio a trovarlo!!
Questo è il testo dell'esercizio: Quote:
Codice:
pthread_key_t key=0; void foo(int x) { int *n; if(x==SIGUSR1) { void *p = pthread_getspecific(key); n = (int *)p; *n=*n+1; printf("il thread %u ed n.segnali = %d\n", (int)pthread_self(), *n); } } void *func(void *x) { pthread_setspecific(key, malloc(5*sizeof(int))); while(1) { sleep(1+ rand() % 5); kill(getpid(), SIGUSR1); } } int main(int argc, char *argv[]) { int n, i, err; n=atoi(argv[1]); pthread_t tid[n]; signal(SIGUSR1, foo); pthread_key_create(&key, NULL); for (i=0; i<n ;i++) { if ((err=pthread_create(&tid[i], NULL, func, NULL)) != 0) { printf("errore: %s\n", strerror(err)); exit(1); } } printf("aspetto la terminazione\n"); for(i=0; i<n; i++) pthread_join(tid[i], NULL); return 0; }
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
prova a fare qualche controllo sui puntatori (che non siano null)
es: Codice:
void *p = pthread_getspecific(key); if (p == NULL) { printf("errore"); return; }
__________________
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
si..esce spesso errore...a volte anche da subito...ma come mai??
è la getspecific che fallisce....ma perchè?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Per esempio, controlla la malloc() e tutte le chiamate che ti possono produrre errore. Comunque mi sembra che prepari un'area di memoria mediante la malloc() e poi non la inizializzi. Non so cosa leggerai da li'. Inoltre nella risposta al signal, non controlli se hai letto un'area valida oppure hai letto NULL. E' importante farlo, visto che la chiave e' comunque creata a NULL.
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:19.