[C] Threads

di il
7 risposte

[C] Threads

Salve a tutti. Sto riscontrando grandi difficoltà con questo esercizio sono bloccato da circa 3 giorni. Ho tentato varie strade ma lo stesso non funziona. Magari con qualche dritta per rendere più chiara la situazione. Grazie mille a chi mi aiuterà.

https://onlinegdb.com/wVn55r3A --> link del codice
/*****************************************************************
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.

ESEMPIO DI ESECUZIONE DEL PROGRAMMA
Il worker 1 ha portato somma a 1
Il worker 4 ha portato somma a 5
Il worker 2 ha portato somma a 7
Il worker 3 ha portato somma a 10
Il worker 5 ha portato somma a 15
Il worker 1 ha portato somma a 16
Il worker 2 ha portato somma a 18
Il worker 4 ha portato somma a 22
Il worker 3 ha portato somma a 25
Il worker 5 ha portato somma a 30
Il worker 1 ha portato somma a 31
Il worker 5 ha portato somma a 36
Il worker 4 ha portato somma a 40
Il worker 3 ha portato somma a 43
Valore raggiunto! Termine del programma.

******************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <assert.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 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 i;
    
    /*** COMPLETARE IL MAIN SECONDO QUANTO RICHIESTO DALLA TRACCIA ***/
    for(i=0; i<WORKERS; i++) {
        param[i].numero =i;
        pthread_create(&tid[i], NULL, worker, &param[i]);
    }
    
    for(i=0; i<WORKERS; i++) {
        pthread_mutex_lock(&param[i].mutex);
        while (somma < LIMITE)
            pthread_cond_wait(&param[i].cond, &param[i].mutex);
        somma++;
        pthread_cond_broadcast(&param[i].cond);
        pthread_mutex_unlock(&param[i].mutex);
    }

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

void *worker(void *param) {
    /*** IMPLEMENTARE LA FUNZIONE WORKER COME RICHIESTO DALLA TRACCIA ***/
        TParam *p=(TParam *)param;
    
    sleep(1);
    pthread_mutex_lock(&p->pmutex);
    while (p->psomma < LIMITE){
        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;
}

7 Risposte

  • Re: [C] Threads

    
    main.c:85:38: error: ‘TParam’ {aka ‘struct ’} has no member named ‘mutex’; did you mean ‘pmutex’?
       85 |         pthread_mutex_lock(&param[i].mutex);
          |                                      ^~~~~
          |   
    
    Esattamente cosa non sarebbe chiaro in questo messaggio? Inglese l'hai superato? Il compilatore ti ha pure fatto il disegnino, che può fare di più?
  • Re: [C] Threads

    Ed e' "grasso che cola" la frase

    "... completi il programma... "

    Non tanto tempo fa (quando i programmatori erano Veri Programmatori NON CopiaIncollisti ) la frase sarebbe stata:

    "... scriva il programma... "

  • Re: [C] Threads

    /*****************************************************************
    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.
    
    ESEMPIO DI ESECUZIONE DEL PROGRAMMA
    Il worker 1 ha portato somma a 1
    Il worker 4 ha portato somma a 5
    Il worker 2 ha portato somma a 7
    Il worker 3 ha portato somma a 10
    Il worker 5 ha portato somma a 15
    Il worker 1 ha portato somma a 16
    Il worker 2 ha portato somma a 18
    Il worker 4 ha portato somma a 22
    Il worker 3 ha portato somma a 25
    Il worker 5 ha portato somma a 30
    Il worker 1 ha portato somma a 31
    Il worker 5 ha portato somma a 36
    Il worker 4 ha portato somma a 40
    Il worker 3 ha portato somma a 43
    Valore raggiunto! Termine del programma.
    
    ******************************************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.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 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 i;
        
        /*** COMPLETARE IL MAIN SECONDO QUANTO RICHIESTO DALLA TRACCIA ***/
        for(i=0; i<WORKERS; i++) {
            param[i].numero =i;
            pthread_create(&tid[i], NULL, worker, &param[i]);
        }
        
        for(i=0; i<WORKERS; i++) {
            pthread_mutex_lock(param[i].pmutex);
            while (somma < LIMITE)
                pthread_cond_wait(param[i].pcond, param[i].pmutex);
            somma++;
            pthread_cond_broadcast(param[i].pcond);
            pthread_mutex_unlock(param[i].pmutex);
        }
    
        for(i=0; i<WORKERS; i++)
            pthread_join(tid[i], NULL);
        
        return 0;
    }
    
    
    
    void *worker(void *param) {
        /*** IMPLEMENTARE LA FUNZIONE WORKER COME RICHIESTO DALLA TRACCIA ***/
            TParam *p=(TParam *)param;
        
        sleep(1);
        pthread_mutex_lock(p->pmutex);
        while (p->psomma < (int *)LIMITE){
            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;
    }
    
    Adesso non compare nessun tipo di warning
  • Re: [C] Threads

    Https://onlinegdb.com/xwBGANzq L'unico problema che non stampa i valori
  • Re: [C] Threads

    I programmi vanno scritti e testati un pezzo alla volta, sennò non ne esci più (e in alcuni casi non è possibile nemmeno debuggare)
    
    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    
    #define WORKERS 5
    
    /* 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_t tid[WORKERS];
        TParam param[WORKERS];
        int i;
        
        for(i=0; i<WORKERS; i++) {
            param[i].numero = i;
            param[i].psomma = &somma; // SE HO UN PUNTATORE RANDOM IL SEGMENTATION FAULT E' MOLTO PROBABILE
            pthread_create(&tid[i], NULL, worker, &param[i]);
        }
    
        for(i=0; i<WORKERS; i++)
            pthread_join(tid[i], NULL);
        
        return 0;
    }
    
    void *worker(void *param) {
        TParam *p=(TParam *)param;
        
        sleep(p->numero);
       
        *p->psomma += p->numero;
        
        printf("Il numero progressivo e' %d\n", p->numero);
        printf("Il nuovo valore di somma e' %d\n", *p->psomma);    
    }
    
    
  • Re: [C] Threads

    migliorabile ha scritto:


    Ed e' "grasso che cola" la frase

    "... completi il programma... "

    Non tanto tempo fa (quando i programmatori erano Veri Programmatori NON CopiaIncollisti ) la frase sarebbe stata:

    "... scriva il programma... "

    ah... in bei vecchi tempi in cui c'era LVI e i programmatori erano veri programmatori
  • Re: [C] Threads



    Beh però migliorabile non ha tutti i torti. Una volta gcc ti faceva morire male quando c'era un errore, adesso ci sono tutti i comfort e però pure i ragazzi validi si perdono in un bicchiere d'acqua. Qualcosina la devono rivedere all'università. Fine OT
Devi accedere o registrarti per scrivere nel forum
7 risposte