Salve a tutti, ho scritto un codice in C per il problema degli scrittori/lettori di una variabile condivisa.
Purtroppo però mai uno scrittore viene schedulato, l'unico caso per vedere un incremento della variabile condivisa è che imposti THREADR a 1.
Mi sapreste dire dove sbaglio?
grazie anticipatamente
codice:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define THREADR 5
#define THREADW 15
/* ####
Ogni Scrittore incrementa il valore di x (variabile condivisa)
Ogni lettore dichiara il valore x che sta leggendo
Se il thread funziona il lettore leggerà sempre l'ultimo valore dichiarato dallo
scrittore
Gli scrittori possono scrivere uno per volta, nel mentre nessuno può leggere
I lettori possono leggere contemporaneamente
*/
int x, numlettori;
pthread_mutex_t writing; // per sequenzializzare l'accesso al primo lettore e agli scrittori
pthread_mutex_t mutex; // per accedere alla variabile condivisa dai lettori numlettori
void* lettore()
{
while(1)
{
pthread_mutex_lock(&mutex); //blocco il mutex per essere l'unico a controllare il numero dei lettori
numlettori++; //SEZIONE CRITICA
if(numlettori==1) //solo se sono il primo lettore blocco il write
pthread_mutex_lock(&writing);
pthread_mutex_unlock(&mutex);
printf("Sono il lettore : %d sto leggendo x= %d \n",pthread_self(),x);
/*se sono l'unico lettore la ho chiamato la wait su writing quindi nessun altro puo sovrascrivere x.
se non sono il primo lettore anche se non ho chiamato la wait nessuno scrittore potrà aggiornare x perchè la wait l'ha chiamata già un altro */
pthread_mutex_lock(&mutex);
numlettori--; //SEZIONE CRITICA
if(numlettori==0) //Se sono l'ultmo lettore rilascio il mutex per scrivere
pthread_mutex_unlock(&writing);
pthread_mutex_unlock(&mutex);
}
}
void* scrittore()
{
//printf("###############################\n");
while(1)
{
//printf("######################\n");
pthread_mutex_lock(&writing);
x++; //SEZIONE CRITICA
printf("Sono lo Scrittore : %d , Sto scrivendo x = %d \n",pthread_self(),x); //SEZIONE CRITICA
pthread_mutex_unlock(&writing);
}
}
int main()
{
int i,j;
x=0;
numlettori=0;
pthread_t read[THREADR],wrt[THREADW];
pthread_mutex_init(&mutex,NULL);
pthread_mutex_init(&writing,NULL);
for(i=0;i<THREADR;i++)
pthread_create(&read[i],NULL,&lettore,NULL);
for(i=j;j<THREADW;j++)
pthread_create(&wrt[j],NULL,&scrittore,NULL);
//pthread_exit(NULL);
return 0;
}