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, ¶m[i]);
}
for(i=0; i<WORKERS; i++) {
pthread_mutex_lock(¶m[i].mutex);
while (somma < LIMITE)
pthread_cond_wait(¶m[i].cond, ¶m[i].mutex);
somma++;
pthread_cond_broadcast(¶m[i].cond);
pthread_mutex_unlock(¶m[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;
}