Υλικό υπολογιστών

Γνώση Υπολογιστών >> Υλικό υπολογιστών >  >> Ηλεκτρονική αναγνώστες βιβλίων

Γράψτε μια λύση οθόνης στο πρόβλημα των αναγνωστών;

`` `Python

Εισαγωγή σπειρώματος

χρόνος εισαγωγής

CLASS ReaderWriterLock:

"" "

Μια λύση παρακολούθησης για το πρόβλημα των αναγνωστών.

Γνωρίσματα:

read_count (int):αριθμός αναγνώστες που έχουν επί του παρόντος πρόσβαση στον πόρο.

write_count (int):αριθμός συγγραφέων που έχουν επί του παρόντος πρόσβαση στον πόρο.

Readers_Waiting (λίστα):Λίστα αναγνώστες που περιμένουν να έχουν πρόσβαση στον πόρο.

Writers_Waiting (Λίστα):Λίστα συγγραφέων που περιμένουν να έχουν πρόσβαση στον πόρο.

κλειδαριά (threading.lock):Μια κλειδαριά για την προστασία του κρίσιμου τμήματος.

"" "

def __init __ (εαυτός):

self.read_count =0

self.write_count =0

self.readers_waiting =[]

self.writers_waiting =[]

self.lock =threading.lock ()

def quire_read (self):

"" "

Αποκτά κλείδωμα ανάγνωσης.

"" "

με self.lock:

ενώ self.write_count> 0 ή self.writers_waiting:

self.readers_waiting.append (Threading.Current_Thread ())

self.lock.release ()

threading.current_thread (). Περιμένετε ()

self.lock.acquire ()

self.read_count +=1

def release_read (self):

"" "

Απελευθερώνει μια κλειδαριά ανάγνωσης.

"" "

με self.lock:

self.read_count -=1

αν self.read_count ==0 και self.writers_waiting:

συγγραφέας =self.writers_waiting.pop (0)

writer.notify ()

def quire_write (self):

"" "

Αποκτά κλείδωμα εγγραφής.

"" "

με self.lock:

ενώ self.read_count> 0 ή self.write_count> 0 ή self.writers_waiting:

self.writers_waiting.append (Threading.Current_Thread ())

self.lock.release ()

threading.current_thread (). Περιμένετε ()

self.lock.acquire ()

self.write_count +=1

def release_write (self):

"" "

Απελευθερώνει μια κλειδαριά εγγραφής.

"" "

με self.lock:

self.write_count -=1

αν self.readers_waiting:

reader =self.readers_waiting.pop (0)

reader.notify ()

Αναγνώστης κλάσης (Threading.Thread):

"" "

Ένα νήμα αναγνώστη.

"" "

def __init __ (εαυτός, κλειδαριά):

super () .__ init __ ()

self.lock =κλειδαριά

Def Run (Self):

για _ στην περιοχή (5):

self.lock.acquire_read ()

εκτύπωση (F "Reader {self.name} είναι ανάγνωση")

Time.Sleep (0,5)

self.lock.release_read ()

εκτύπωση (F "Reader {self.name} τελική ανάγνωση")

CLASS WRITER (Threading.Thread):

"" "

Ένα νήμα συγγραφέα.

"" "

def __init __ (εαυτός, κλειδαριά):

super () .__ init __ ()

self.lock =κλειδαριά

Def Run (Self):

για _ στην περιοχή (5):

self.lock.acquire_write ()

εκτύπωση (F "Writer {self.name} γράφει")

time.sleep (1)

self.lock.release_write ()

εκτύπωση (F "Writer {self.name} τελειωμένη γραφή")

Εάν __name__ =="__main__":

κλειδαριά =readerWriterLock ()

Readers =[Reader (κλειδαριά) για _ στην περιοχή (3)]

συγγραφείς =[συγγραφέας (κλειδαριά) για _ στην περιοχή (2)]

Για αναγνώστη στους αναγνώστες:

reader.start ()

Για συγγραφείς σε συγγραφείς:

writer.start ()

Για αναγνώστη στους αναγνώστες:

reader.join ()

Για συγγραφείς σε συγγραφείς:

writer.join ()

`` `

Επεξήγηση:

1.

- `read_count`,` write_count`:Παρακολουθεί τον αριθμό των ενεργών αναγνωστών και συγγραφέων.

- `readers_waiting`,` writers_waiting`:Οι λίστες για να κρατήσουν τα νήματα που περιμένουν για πρόσβαση.

- `lock`:ένα mutex για την προστασία του κρίσιμου τμήματος όπου τροποποιούνται οι μετρητές και οι λίστες.

2. `Acquire_Read`:

- Αποκτά μια κλειδαριά ανάγνωσης:

- Πρώτα ελέγχει εάν έχουν πρόσβαση ή περιμένουν συγγραφείς. Αν ναι, ο αναγνώστης προστίθεται στη λίστα `Readers_waiting` και περιμένει.

- Μόλις ικανοποιηθεί η κατάσταση, το `read_count 'του αναγνώστη αυξάνεται, υποδηλώνοντας την καταχώρισή του.

3. `release_read`:

- απελευθερώνει κλειδαριά ανάγνωσης:

- μειώνει το `read_count`.

- Εάν δεν υπάρχουν άλλοι αναγνώστες και οι συγγραφείς περιμένουν, ενημερώνεται ο πρώτος συγγραφέας στο `writers_waiting`.

4. `Acquire_Write`:

- αποκτά κλείδωμα εγγραφής:

- Ελέγχει πρώτα εάν έχουν πρόσβαση ή αναμονή οποιοσδήποτε αναγνώστες ή συγγραφείς. Αν ναι, ο συγγραφέας προστίθεται στο `writers_waiting` και περιμένει.

- Μόλις ικανοποιηθεί η κατάσταση, το `write_count 'του συγγραφέα αυξάνεται, υποδηλώνοντας την καταχώρισή του.

5. `release_write`:

- Απελευθερώνει μια κλειδαριά εγγραφής:

- μειώνει το `write_count`.

- Αν οι αναγνώστες περιμένουν, ενημερώνεται ο πρώτος αναγνώστης στο `readers_waiting`.

6.

- Αυτές οι τάξεις αντιπροσωπεύουν νήματα αναγνώστη και συγγραφέα.

- Χρησιμοποιούν τις μεθόδους `Acquire_Read/Acquire_Write 'και` Release_Read/Release_Write' για να αποκτήσουν πρόσβαση στον κοινό πόρο.

Πώς λειτουργεί:

- Η οθόνη εξασφαλίζει αποκλειστική πρόσβαση στον πόρο για τους συγγραφείς.

- Οι αναγνώστες επιτρέπεται να διαβάζουν ταυτόχρονα, αλλά κανένας αναγνώστης δεν μπορεί να διαβάσει ενώ ένας συγγραφέας γράφει.

- Τα νήματα αναμονής διαχειρίζονται σε ουρές και ειδοποιούνται όταν ο πόρος είναι διαθέσιμος.

Σημείωση:

- Η μέθοδος `notify ()` ενός νήματος χρησιμοποιείται για να ξυπνήσει ένα νήμα αναμονής.

- Αυτός ο κώδικας χρησιμοποιεί την έννοια μιας μεταβλητής κατάστασης (που υπονοείται από το `wait ()` και `ειδοποιήστε ()` σε αυτό το παράδειγμα) για να χειριστεί την αναμονή και την ειδοποίηση του νήματος.

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα