88Leo88 (Normal User)
Newbie
Messaggi: 13
Iscritto: 15/01/2013
|
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:
Codice sorgente - presumibilmente C++ |
#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????
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Dichiara timeout come variabile globale.
Codice sorgente - presumibilmente C# |
int timeout = 0; void *thread_check_time(void *arg) { int t_max; printf("Inserisci il tempo massimo di attesa(espresso in secondi): "); scanf("%d", &t_max); sleep(t_max); timeout = 1; } // ....
|
|
|
88Leo88 (Normal User)
Newbie
Messaggi: 13
Iscritto: 15/01/2013
|
Postato originariamente da pierotofy:
Dichiara timeout come variabile globale.
Codice sorgente - presumibilmente C# |
int timeout = 0; void *thread_check_time(void *arg) { int t_max; printf("Inserisci il tempo massimo di attesa(espresso in secondi): "); scanf("%d", &t_max); sleep(t_max); timeout = 1; } // ....
|
|
Ti ringrazio per la risposta, il problema è che io devo dare pure il tempo massimo di esecuzione del software.
Se vedi il testo che è riportato prima del mio codice viene appunto richiesta questa cosa |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
E non e' quello lo scopo di thread_check_time?
Hai provato la soluzione che ti ho postato?
|
|
88Leo88 (Normal User)
Newbie
Messaggi: 13
Iscritto: 15/01/2013
|
Postato originariamente da pierotofy:
E non e' quello lo scopo di thread_check_time?
Hai provato la soluzione che ti ho postato? |
Può essere che il mal funzionamento che ho riscontrato prima era dovuto dalla mancanza della pthread_join dopo la printf?
Prima avevo provato il sfw utilizzando la variabile globale senza inserire la pthread_join adesso mettendo la pthread_join e sempre con la variabile globale il sfw sembra funzionare.
Mi sembra che corrisponde tutto anche alla richiesta iniziale del testo mi confermi? |
|
88Leo88 (Normal User)
Newbie
Messaggi: 13
Iscritto: 15/01/2013
|
Postato originariamente da pierotofy:
E non e' quello lo scopo di thread_check_time?
Hai provato la soluzione che ti ho postato? |
Facendo così però nella condizione finale rimane sempre in sospeso solo per il tempo quando invece
deve guardare pure accuracy.......come posso sistemare il codice?? |
|
()
Newbie
Messaggi:
Iscritto:
|
----- cazzata -----
Ultima modifica effettuata da il 20/01/2013 alle 14:29 |
|
88Leo88 (Normal User)
Newbie
Messaggi: 13
Iscritto: 15/01/2013
|
Postato originariamente da TheDarkJuster:
----- cazzata ----- |
Beh ma accuracy deve essere un valore fisso cioè ke non cambia! Nel corso dell'esecuzione del codice...
può essere vista quasi come costante. Io voglio che il valore di pi greco che esce dalla serie di gregory leibniz
sia precisa allo xxxx rispetto alla costante M_PI presente all'interno dell'header math.h.
Una cosa che ho notato adesso invece è che la funzione sleep (lavorando su OS X) non fa il proprio dovere.....
se non erro dovrebbe essere inserita nella libreria windows.h che ovviamente sotto Mac non c'è |
|
()
Newbie
Messaggi:
Iscritto:
|
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <math.h> #include <windows.h> bool timeout = false; int t_max = 0; bool timeout = false; int t_max = 0; void *thread_check_time(void *arg) { timeout = false; printf("Inserisci il tempo massimo di attesa(espresso in secondi): "); scanf("%d", &t_max); Sleep(t_max); timeout = true; } int main(void) { float pi_greco = 0, pi_grecotot = 0, num_disp = 1.0f, error = 5, accuracy = 0; int i = 0, denominatore = 1; printf("Inserisci il grado di accuratezza : "); scanf("%f", &accuracy); pthread_t thread_time; pthread_create(&thread_time, NULL, thread_check_time, NULL); while ((error > accuracy) || (!timeout)) { pi_greco = 1.0f / num_disp; if (((i % 2) == 0) || (i == 0)) pi_grecotot = pi_grecotot + pi_greco; else pi_grecotot = pi_grecotot - pi_greco; num_disp = num_disp + 2.0f; i++; error = 4 * pi_grecotot - M_PI; } pthread_join(thread_time, NULL); printf("Il valore di pigreco approssimato a %f è %f\n", accuracy, 4 * pi_grecotot); return 0; }
|
Secondo me dovrebbe essere così, logicamente mi sembra corretto, eppure c' è qualcosa che non mi torna.
|
|