19/01/13 15:48
88Leo88
Ciao a tutti, sto svolgendo questo esercizio:
Scrivere un programma che attiva una serie di thread per effettuare il calcolo approssimato di π.
Il programma principale prende come input da riga di comando un parametro che indica il grado di accuratezza (accuracy) per il calcolo di π e il tempo massimo di attesa dopo cui il main interrompe tutti i thread.
I thread vengono utilizzati (cercando di massimizzare il numero di operazioni effettuate nel lasso di tempo a disposizione) per effettuare le seguenti operazioni per il calcolo di π tramite la serie di Gregory-Leibniz: π = 4/1 − 4/3 + 4/5 − 4/7 + 4/9 − 4/11 ...
I thread vengono tutti interrotti quando una delle due condizioni seguenti risulta verificata:

1) il tempo massimo di attesa è stato superato;

2) la differenza tra il valore stimato di π e il valore Math.PI è minore di accuracy.
Sono arrivato a questa soluzione:
Al fine di ovviare il problema del tempo metto in sleep il thread che mi governa questo ciclo però come faccio
a restituire il valore al fine di poter eseguire il ciclo do - while con la condizione (fabs(error) > accuracy || (timeout ==1) ??
Premetto che sono alle prime armi su questa parte, ho letto un pò di documentazione e ho visto che il valore di ritorno della funzione chiamata dal thread è sempre void.....
Qualcuno mi può aiutare????
Scrivere un programma che attiva una serie di thread per effettuare il calcolo approssimato di π.
Il programma principale prende come input da riga di comando un parametro che indica il grado di accuratezza (accuracy) per il calcolo di π e il tempo massimo di attesa dopo cui il main interrompe tutti i thread.
I thread vengono utilizzati (cercando di massimizzare il numero di operazioni effettuate nel lasso di tempo a disposizione) per effettuare le seguenti operazioni per il calcolo di π tramite la serie di Gregory-Leibniz: π = 4/1 − 4/3 + 4/5 − 4/7 + 4/9 − 4/11 ...
I thread vengono tutti interrotti quando una delle due condizioni seguenti risulta verificata:

1) il tempo massimo di attesa è stato superato;

2) la differenza tra il valore stimato di π e il valore Math.PI è minore di accuracy.
Sono arrivato a questa soluzione:
#include <stdio.h> #include <pthread.h> #include <time.h> #include <math.h> void *thread_check_time(void *arg) { int timeout = 0; int t_max; printf("Inserisci il tempo massimo di attesa(espresso in secondi): "); scanf("%d", &t_max); sleep(t_max); timeout = 1; } int main(void) { float pi_greco = 0; float pi_grecotot = 0; float error; int i = 0; int denominatore = 1; float accuracy; printf("Inserisci il grado di accuratezza : "); scanf("%f", &accuracy); pthread_t thread_time; pthread_create(&thread_time, NULL, thread_check_time, NULL); do { if (i%2 == 0) { pi_greco = (float)4 / (float) denominatore; denominatore = denominatore + 2; } else{ pi_greco = -(float)4 / (float)denominatore; denominatore = denominatore + 2; } pi_grecotot = pi_grecotot + pi_greco; i++; error = pi_grecotot - M_PI; } while ((fabs(error) > accuracy) || (timeout==1)); printf("Il valore di pigreco approssimato a %f è %f\n", accuracy, pi_grecotot); }
Al fine di ovviare il problema del tempo metto in sleep il thread che mi governa questo ciclo però come faccio
a restituire il valore al fine di poter eseguire il ciclo do - while con la condizione (fabs(error) > accuracy || (timeout ==1) ??
Premetto che sono alle prime armi su questa parte, ho letto un pò di documentazione e ho visto che il valore di ritorno della funzione chiamata dal thread è sempre void.....
Qualcuno mi può aiutare????
aaa