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;




}