gepeppe
28-05-2008, 14:24
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:
-scrivere un programma che prende da riga di comando un intero n, imposta un estore per il segnale SIGUSR1 e poi crea n thread
-ciascun thread aspetta un numero casuale di secondi tra 1 e 5, poi invia il segnale SIGUSR1 a uno a caso tra i suoi fratelli thread (e poi ripete il procedimento)
● il gestore del segnale stampa a video il tid del thread corrente e il numero totale di segnali SIGUSR1 ricevuti da quel thread fino a quel momento
L'esercizio teoricamente l'ho risolto, ma non riesco a capire il motivo di questo errore. Ecco il mio programma:
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;
}
Questo è il testo dell'esercizio:
-scrivere un programma che prende da riga di comando un intero n, imposta un estore per il segnale SIGUSR1 e poi crea n thread
-ciascun thread aspetta un numero casuale di secondi tra 1 e 5, poi invia il segnale SIGUSR1 a uno a caso tra i suoi fratelli thread (e poi ripete il procedimento)
● il gestore del segnale stampa a video il tid del thread corrente e il numero totale di segnali SIGUSR1 ricevuti da quel thread fino a quel momento
L'esercizio teoricamente l'ho risolto, ma non riesco a capire il motivo di questo errore. Ecco il mio programma:
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;
}