Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Pthread
Forum - C/C++ - Pthread

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
88Leo88 (Normal User)
Newbie


Messaggi: 13
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 16:48
Sabato, 19/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++

  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <time.h>
  4. #include <math.h>
  5.  
  6. void *thread_check_time(void *arg)
  7. {
  8.     int timeout = 0;
  9.     int t_max;
  10.     printf("Inserisci il tempo massimo di attesa(espresso in secondi): ");
  11.     scanf("%d", &t_max);
  12.     sleep(t_max);
  13.     timeout = 1;
  14. }
  15.  
  16.  
  17. int main(void)
  18. {
  19.     float pi_greco = 0;
  20.     float pi_grecotot = 0;
  21.     float error;
  22.     int i = 0;
  23.     int denominatore = 1;
  24.     float accuracy;
  25.     printf("Inserisci il grado di accuratezza : ");
  26.     scanf("%f", &accuracy);
  27.     pthread_t thread_time;
  28.     pthread_create(&thread_time, NULL, thread_check_time, NULL);
  29.     do {
  30.         if (i%2 == 0) {
  31.             pi_greco = (float)4 / (float) denominatore;
  32.             denominatore = denominatore + 2;
  33.         }
  34.         else{
  35.             pi_greco = -(float)4 / (float)denominatore;
  36.             denominatore = denominatore + 2;
  37.         }
  38.         pi_grecotot = pi_grecotot + pi_greco;
  39.         i++;
  40.         error = pi_grecotot - M_PI;
  41.     } while ((fabs(error) > accuracy) || (timeout==1));
  42.     printf("Il valore di pigreco approssimato a %f è %f\n", accuracy, pi_grecotot);
  43. }



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????

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:46
Sabato, 19/01/2013
Dichiara timeout come variabile globale.

Codice sorgente - presumibilmente C#

  1. int timeout = 0;
  2.  
  3. void *thread_check_time(void *arg)
  4. {
  5.     int t_max;
  6.     printf("Inserisci il tempo massimo di attesa(espresso in secondi): ");
  7.     scanf("%d", &t_max);
  8.     sleep(t_max);
  9.     timeout = 1;
  10. }
  11.  
  12. // ....



Il mio blog: https://piero.dev
PM Quote
Avatar
88Leo88 (Normal User)
Newbie


Messaggi: 13
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 18:52
Sabato, 19/01/2013
Testo quotato

Postato originariamente da pierotofy:

Dichiara timeout come variabile globale.

Codice sorgente - presumibilmente C#

  1. int timeout = 0;
  2.  
  3. void *thread_check_time(void *arg)
  4. {
  5.     int t_max;
  6.     printf("Inserisci il tempo massimo di attesa(espresso in secondi): ");
  7.     scanf("%d", &t_max);
  8.     sleep(t_max);
  9.     timeout = 1;
  10. }
  11.  
  12. // ....




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 :(

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:00
Sabato, 19/01/2013
E non e' quello lo scopo di thread_check_time?

Hai provato la soluzione che ti ho postato?


Il mio blog: https://piero.dev
PM Quote
Avatar
88Leo88 (Normal User)
Newbie


Messaggi: 13
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 19:08
Sabato, 19/01/2013
Testo quotato

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?

PM Quote
Avatar
88Leo88 (Normal User)
Newbie


Messaggi: 13
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 0:43
Domenica, 20/01/2013
Testo quotato

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??

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:28
Domenica, 20/01/2013
----- cazzata -----

Ultima modifica effettuata da il 20/01/2013 alle 14:29
PM Quote
Avatar
88Leo88 (Normal User)
Newbie


Messaggi: 13
Iscritto: 15/01/2013

Segnala al moderatore
Postato alle 14:33
Domenica, 20/01/2013
Testo quotato

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'è :(

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:14
Domenica, 20/01/2013
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <math.h>
  5. #include <windows.h>
  6.  
  7. bool timeout = false;
  8. int t_max = 0;
  9.  
  10. bool timeout = false;
  11. int t_max = 0;
  12.  
  13. void *thread_check_time(void *arg)
  14. {
  15.     timeout = false;
  16.     printf("Inserisci il tempo massimo di attesa(espresso in secondi): ");
  17.     scanf("%d", &t_max);
  18.     Sleep(t_max);
  19.     timeout = true;
  20. }
  21.  
  22. int main(void)
  23. {
  24.     float pi_greco = 0, pi_grecotot = 0, num_disp = 1.0f, error = 5, accuracy = 0;
  25.     int i = 0, denominatore = 1;
  26.     printf("Inserisci il grado di accuratezza : ");
  27.     scanf("%f", &accuracy);
  28.     pthread_t thread_time;
  29.     pthread_create(&thread_time, NULL, thread_check_time, NULL);
  30.     while ((error > accuracy) || (!timeout))
  31.         {
  32.                 pi_greco = 1.0f / num_disp;
  33.                 if (((i % 2) == 0) || (i == 0))
  34.                         pi_grecotot = pi_grecotot + pi_greco;
  35.                 else
  36.                         pi_grecotot = pi_grecotot - pi_greco;
  37.                 num_disp = num_disp + 2.0f;
  38.         i++;
  39.         error = 4 * pi_grecotot - M_PI;
  40.         }
  41.     pthread_join(thread_time, NULL);
  42.     printf("Il valore di pigreco approssimato a %f è %f\n", accuracy, 4 * pi_grecotot);
  43.     return 0;
  44. }



Secondo me dovrebbe essere così, logicamente mi sembra corretto, eppure c' è qualcosa che non mi torna.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo