4.Το πρόβλημα του παραγώγου καταναλωτή

            Ο προσομοιωτής αυτός περιγράφει το πρόβλημα του παραγωγού/καταναλωτή. Θεωρούνται δυο ρουτίνες οι οποίες είναι σωστές όταν τρέχουν ξεχωριστά, όμως όταν τρέχουν παράλληλα μπορεί να μη λειτουργήσουν σωστά.

                Η λειτουργία του προσομοιωτή είναι χωρισμένη σε λογικά βήματα. Ο χειρισμός του προσομοιωτή γίνεται με τη χρήση των  παρακάτω πλήκτρων:

                Επιλέγοντας  εμφανίζεται το επόμενο βήμα, ενώ επιλέγοντας  ο προσομοιωτής επιστρέφει στο προηγούμενο λογικό βήμα. Το  κάνει άλμα στο τελευταίο βήμα ενώ το πλήκτρο  φέρνει το προσομοιωτή στην αρχική κατάσταση.

Ο προσομοιωτής χωρίζεται στα εξής βήματα τα οποία ο χρήστης προκαλεί σειριακά επιλέγοντας  το πλήκτρο  .

·               Έστω ότι η τιμή της μεταβλητής «counter» είναι αρχικά 5 και ότι οι διεργασίες Producer και Consumer εκτελούν τις εντολές counter++ και counter—ταυτόχρονα. Μετά την εκτέλεση των διεργασιών, το μόνο σωστό αποτέλεσμα θα ήταν: “counter=5”.

·               Στο δεύτερο βήμα φαίνονται οι υλοποιήσεις σε γλώσσα μηχανής των εντολών: counter++ και counter—.

·               Η ταυτόχρονη εκτέλεση των counter++ και counter—είναι αντίστοιχη με την σειριακή εκτέλεση όπου οι εντολές κάθε διεργασίας παρεμβάλονται με αυθαίρετο τρόπο.

·               Στη συνέχεια καθώς ο χρήστης επιλέγει  το πλήκτρο   , οι εντολές παρεμβάλονται και αλλάζουν αντίστοιχα οι τιμές στους καταχωρητές register1 και register2.

·               Παρατηρείστε ότι η εκτέλεση καταλήγει στην μη σωστή κατάσταση «counter=4». Αυτό σημαίνει ότι η μεταβλητή counter υποδεικνύει 4 γεμάτους buffer ενώ στην πραγματικότητα υπάρχουν 5 γεμάτοι buffer. Η προσομοίωση καταλήγει σε αυτή τη μη σωστή κατάσταση επειδή επιτράπηκε και στις δυο διεργασίες πρόσβαση στην μεταβλητή counter ταυτόχρονα. Οι συνθήκες κατά τις οποίες, πολλές μεταβλητές έχουν πρόσβαση και χρησιμοποιούν τα ίδια δεδομένα και όπου το αποτέλεσμα της εκτέλεσης εξαρτάται από την ειδική σειρά με την οποία δίνεται πρόσβαση λέγονται συνθήκες ανταγωνισμού (“race condition”).