Εισαγωγή σπειρώματος
χρόνος εισαγωγής
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 ()` και `ειδοποιήστε ()` σε αυτό το παράδειγμα) για να χειριστεί την αναμονή και την ειδοποίηση του νήματος.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα