typedef int semaphore; int rc = 0; semaphore mutex, writersQueue, db; mutex = writersQueue = db = 1; void reader(void) { down(&writersQueue); /* Αν υπάρχει writer που περιμένει η reader αναστέλλεται */ up(&writersQueue); /* Κάνει ξανά την writersQueue 1 */ down(&mutex); /* Αποκλειστική πρόσβαση στην rc */ rc++; /* Ένας ακόμη reader */ if (rc==1) down(&db); /* Ο πρώτος προσπαθεί να πάρει αποκλειστική πρόσβαση */ up(&mutex); /* Ελεύθερη πρόσβαση στην rc */ read_data_base(); /* κρίσιμο τμήμα */ down(&mutex); /* Αποκλειστική πρόσβαση στην rc */ rc--; /* Ένας reader λιγότερος */ if (rc==0) up(&db); /* Αν είναι ο τελευταίος ελευθερώνει την ουρά στον db */ up(&mutex); /* Ελεύθερη πρόσβαση στην rc */ use_data_read(); /* μη κρίσιμο τμήμα */ } void writer(void) { down(&writersQueue); /* Ένας writer στην ουρά. Αν υπάρχουν άλλοι αναστέλλεται */ down(&db); /* Αποκλειστική πρόσβαση */ write_data_base(); /* Κρίσιμο τμήμα */ up(&writersQueue); /* Απελευθέρωσε έναν writer ή reader από την ουρά */ up(&db); /* Ελεύθερη πρόσβαση */ }