ciao ragazzi avrei un problema.non riesco a comprendere una parte di codice.chi me la spiega???


codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
#include <pthread.h>
#include <semaphore.h>
#define NR 4
#define NW 3
 
pthread_mutex_t mutex, mutex_data;
typedef struct{char *scrittore; int numero; int info;
               }dataobject;
dataobject data = {"***", -1};
int n, reader_count=0;



void * writer(void *x){
   int n, i=0;
   int k, number=*((int*)x);
   printf("scrittore %d creato \n\n",number);
   for (;;) {
srand((unsigned int) time(NULL));
        n = rand() % 10+ 1; i++;
        printf("scrittore: %d \n", number);
        printf("genera il dato  %d\n", i);
        pthread_mutex_lock(&mutex_data);
        data.scrittore = "writer";
        data.numero = number; data.info=i;
        printf("scrittore: %d\n",number);
        printf("scrive il dato\n");
        printf("%s %d numero %d\n", data.scrittore,
                data.numero, data.info);
        pthread_mutex_unlock(&mutex_data);
        sleep(n);
   }
}

void * reader(void *x){
   int k, number=*((int*)x);
   dataobject local_data_image;
   printf("lettore  %d  creato\n\n", number);
   for (;;) {
      srand((unsigned int) time(NULL));
      n = rand() % 4 + 1;
      pthread_mutex_lock(&mutex);   // NON CAPISCO QUESTO PEZZO DA QUI FINO A
      if(++reader_count==1)
      pthread_mutex_lock(&mutex_data);
     pthread_mutex_unlock(&mutex); // QUI
 

      local_data_image=data;
      printf(“lettore %d : \n", number);
      printf("leggo %d scritto da %s %d\n", data.info, 
             data.scrittore, data.numero);
      pthread_mutex_lock(&mutex);
if(--reader_count==0)
pthread_mutex_unlock(&mutex_data);
        //se non ci sono altri lettori gli scrittori possono
accedere il dato
       pthread_mutex_unlock(&mutex);
 
// noncritical region
       usleep(n);
       printf("lettore %d : \n", number);
       printf("locale %d from \n", 
               local_data_image.info, 
               local_data_image.numero);
sleep(n);
}
}