online compiler and debugger for c/c++

code. compile. run. debug. share.
Source Code   
Language
/***************************************************************** 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; }

Compiling Program...

Command line arguments:
Standard Input: Interactive Console Text

                

                

Program is not being debugged. Click "Debug" button to start program in debug mode.

#FunctionFile:Line
VariableValue
RegisterValue
ExpressionValue