Threads

di il
6 risposte

Threads

Salve a tutti. Sto riscontrando dei problemi con questo esercizio da 2 giorni. Non riesco a risolvere. Mi esce questa schermata e non so come fare


/*****************************************************************
Il candidato completi il programma fornito, implementando il main e la funzione worker.
Il programma crea 5 worker threads, ciascuno dei quali esegue la
funzione 'worker'. Ad ogni worker thread è assegnato un numero
identificativo progressivo da 1 a 5. I worker thread e il thread principale
lavorano su una variabile condivisa 'somma', di tipo intero,
inizializzata a 0 dal main.

I worker thread eseguono il seguente algoritmo:
1. Aspetta per 1 secondo.
2. Aggiungi il tuo numero identificativo a 'somma',
stampando il tuo numero identificativo e il nuovo
valore di 'somma'.
3. Ricomincia dal passo 1.

Il thread principale, dopo aver creato i worker thread, esegue il
seguente algoritmo:
1. Aspetta fino a che 'somma' diventi maggiore di 40.
2. Termina l'esecuzione del programma.

Il thread principale e i worker thread devono gestire in maniera corretta
la sincronizzazione nell'accesso alla variabile condivisa.

Viene fornita la struttura TParam, che il main usa per passare le informazioni
necessarie ai worker thread.

******************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <pthread.h>
#include <stdbool.h>

#define WORKERS 5
#define LIMITE 40

/* Struttura dati usata per passare le informazioni ai worker */
typedef struct {
    int numero; /* Numero progressivo assegnato al worker */
    int *psomma; /* Puntatore alla variabile condivisa */
    pthread_mutex_t *pmutex; /* Puntatore al mutex per la sincronizzazione */
    pthread_cond_t *pcond;   /* Puntatore alla variabile condition */
} TParam;

/* Prototipo della funzione dei worker thread */
void *worker(void *);


int main(int argc, char *argv[]) {
    int somma = 0; /* La variabile da condividere con i worker */
    pthread_mutex_t mutex; /* Mutex per la sincronizzazione */
    pthread_cond_t  cond;  /* Variabile condition per la sincronizzazione */
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    pthread_t tid[WORKERS];
    TParam param[WORKERS];
    int arg[WORKERS];
    int i;
    

    for(i=0; i<WORKERS; i++) {
        arg[i] = i;
        if (pthread_create(&tid[i], NULL, worker, &param[i]) != 0) {
            printf("Errore nella creazione thread\n");
            return -1;
        }
    }
    
    while(true) {
        pthread_mutex_lock(&param->pmutex);
        while(somma < LIMITE)
        pthread_cond_wait(&param->pcond, &param->pmutex);
        for(i=0; i < LIMITE; i++)
          somma+= arg[i];
        pthread_cond_signal(&param->pcond);
        pthread_mutex_unlock(&param->pmutex);

    for(i=0; i<WORKERS; i++)
        pthread_join(tid[i], NULL);
    
    return 0;
}
}



void *worker(void *param) {
    TParam *p = (TParam *)param;
    int i;
    
    while(true) {
        pthread_mutex_lock(&p->pmutex);
        while(i < WORKERS)
        pthread_cond_wait(&p->pcond, &p->pmutex);
        p->psomma = p->numero;
        printf("Il numero progressivo è %d", p->numero);
        printf("Il nuovo valore di somma è %d", p->psomma);
        pthread_cond_signal(&p->pcond);
        pthread_mutex_unlock(&p->pmutex);
    }
    
    return NULL;
}

6 Risposte

  • Re: Threads

    Ripassa un attimo i puntatori e come si utilizzano anche all'interno delle strutture, senza thread di mezzo
  • Re: Threads

    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <stdbool.h>
    
    #define WORKERS 5
    #define LIMITE 40
    
    /* Struttura dati usata per passare le informazioni ai worker */
    typedef struct {
        int numero; /* Numero progressivo assegnato al worker */
        int *psomma; /* Puntatore alla variabile condivisa */
        pthread_mutex_t *pmutex; /* Puntatore al mutex per la sincronizzazione */
        pthread_cond_t *pcond;   /* Puntatore alla variabile condition */
    } TParam;
    
    /* Prototipo della funzione dei worker thread */
    void *worker(void *);
    
    
    int main(int argc, char *argv[]) {
        int somma = 0; /* La variabile da condividere con i worker */
        pthread_mutex_t mutex; /* Mutex per la sincronizzazione */
        pthread_cond_t  cond;  /* Variabile condition per la sincronizzazione */
        pthread_mutex_init(&mutex, NULL);
        pthread_cond_init(&cond, NULL);
    
        pthread_t tid[WORKERS];
        TParam param[WORKERS];
        int arg[WORKERS];
        int i;
       
    
        for(i=0; i<WORKERS; i++) {
            arg[i] = i;
            if (pthread_create(&tid[i], NULL, worker, &param[i]) != 0) {
                printf("Errore nella creazione thread\n");
                return -1;
            }
        }
       
        while(true) {
            pthread_mutex_lock(param->pmutex);
            while(somma < LIMITE)
            pthread_cond_wait(param->pcond, param->pmutex);
            for(i=0; i < LIMITE; i++)
              somma+= arg[i];
            pthread_cond_signal(param->pcond);
            pthread_mutex_unlock(param->pmutex);
    
        for(i=0; i<WORKERS; i++)
            pthread_join(tid[i], NULL);
       
        return 0;
    }
    }
    
    
    
    void *worker(void *param) {
        TParam *p = (TParam *)param;
        int i;
       
        while(true) {
            pthread_mutex_lock(p->pmutex);
            while(i < WORKERS)
            pthread_cond_wait(p->pcond, p->pmutex);
            p->psomma = p->numero;
            printf("Il numero progressivo è %d", p->numero);
            printf("Il nuovo valore di somma è %d", p->psomma);
            pthread_cond_signal(p->pcond);
            pthread_mutex_unlock(p->pmutex);
        }
       
        return NULL;
    }
  • Re: Threads

    Ho risolto il problema adesso non escono più quegli errori
  • Re: Threads

    Adesso sintatticamente è corretto a parte una riga. Risolto mi pare ottimistico
  • Re: Threads

    Però non riesco a capire come mai non mi stampa i valori
  • Re: Threads

    Prova a iniziare così
    
    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    
    #define WORKERS 5
    #define LIMITE 40
    
    /* Struttura dati usata per passare le informazioni ai worker */
    typedef struct {
        int numero; /* Numero progressivo assegnato al worker */
        int *psomma; /* Puntatore alla variabile condivisa */
        pthread_mutex_t *pmutex; /* Puntatore al mutex per la sincronizzazione */
        pthread_cond_t *pcond;   /* Puntatore alla variabile condition */
    } TParam;
    
    /* Prototipo della funzione dei worker thread */
    void *worker(void *);
    
    int main() {
        int somma = 0; /* La variabile da condividere con i worker */
        pthread_mutex_t mutex; /* Mutex per la sincronizzazione */
        //pthread_cond_t  cond;  /* Variabile condition per la sincronizzazione */    
        pthread_t tid[WORKERS];
        TParam param[WORKERS];
        int i;
        
        if(pthread_mutex_init(&mutex, NULL) != 0){
               printf("Errore nell'inizializzazione del mutex\n");
               return -1;
        }   
        
        for(i=1; i<=WORKERS; i++) {
            param[i].numero = i;
            param[i].psomma = &somma;
            param[i].pmutex = &mutex;
            //param[i].pcond = &cond;
            if (pthread_create(&tid[i], NULL, &worker, &param[i]) != 0) {
                printf("Errore nella creazione thread\n");
                return -2;
            }
        }
        
        for(i=1; i<=WORKERS; i++)
            pthread_join(tid[i], NULL);    
     
        printf("\nLa somma finale e' %d\n", somma);
        
        return 0;
    }
    
    void *worker(void *param) {
        TParam *p = (TParam *)param;
        int stop = 0;
        do{
            sleep(1);
            pthread_mutex_lock(p->pmutex);
            if(*p->psomma > LIMITE)
                stop = 1;
            else{
                printf("Il numero identificativo e' %d, la somma parziale e' %d\n", p->numero, *p->psomma += p->numero);
                fflush(stdout);
            }
            pthread_mutex_unlock(p->pmutex);
        }while(!stop);
    }
    
    Se ogni tanto sbaglia dovrai aggiungere la parte sulle condizioni
Devi accedere o registrarti per scrivere nel forum
6 risposte