Oppure

Loading
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:
#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
19/01/13 17:46
pierotofy
Dichiara timeout come variabile globale.

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;
}

// ....
Il mio blog: piero.dev
19/01/13 17:52
88Leo88
Postato originariamente da pierotofy:

Dichiara timeout come variabile globale.

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 :(
aaa
19/01/13 18:00
pierotofy
E non e' quello lo scopo di thread_check_time?

Hai provato la soluzione che ti ho postato?
Il mio blog: piero.dev
19/01/13 18:08
88Leo88
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?
aaa
19/01/13 23:43
88Leo88
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??
aaa
20/01/13 13:28
----- cazzata -----
Ultima modifica effettuata da 20/01/13 13:29
20/01/13 13:33
88Leo88
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'è :(
aaa