Αυτός ο κώδικας είναι εννοιολογικός και πρέπει να προσαρμοστεί σε μια συγκεκριμένη γλώσσα προγραμματισμού και τις ατομικές λειτουργίες του. Η λειτουργία `compare_and_swap` είναι ένα σύμβολο κράτησης θέσης. Θα χρειαστεί να το αντικαταστήσετε με το ισοδύναμο της γλώσσας σας (π.χ. `std ::atomic_compare_exchange_weak` σε c ++).
`` c ++
#include
// Υποθέτοντας ότι οι ατομικοί ακέραιοι είναι διαθέσιμοι. Αντικαταστήστε με το ισοδύναμο της γλώσσας σας.
// Σημειώστε ότι η χρήση ενός ενιαίου ατομικού ακέραιου ακέραιου μπορεί να έχει επιπτώσεις στην απόδοση
// για ένα σύστημα υψηλής συγκέντρωσης. Για κωδικό σε επίπεδο παραγωγής, σκεφτείτε άλλα
// Δομές δεδομένων για καλύτερη κλιμάκωση (π.χ. ατομικές ουρές).
#include
class multiplereadersingleWriterLock {
ιδιωτικός:
// 0:Ξεκλείδωτο,> 0:αριθμός αναγνώστες, -1:Watter Waiting
std ::atomic
κοινό:
void Acquire_Read () {
ενώ (αληθές) {
int current_value =lock.load ();
αν (current_value <0) {// Writer Waiting, δοκιμάστε ξανά
// να αποφέρει τον επεξεργαστή έτσι ώστε ο συγγραφέας να έχει μια ευκαιρία.
// Μια πιο εξελιγμένη εφαρμογή μπορεί να χρησιμοποιήσει μια μεταβλητή κατάστασης.
συνεχίζω;
} else αν (compare_and_swap (&lock, current_value, current_value + 1)) {
διακοπή; // επιτυχώς απέκτησε κλειδαριά ανάγνωσης
}
}
}
void Release_Read () {
κλειδαριά--; // Count Reader μείωσης. Η ατομική μείωση είναι κρίσιμη.
}
void Acquire_Write () {
ενώ (αληθές) {
αν (compare_and_swap (&lock, 0, -1)) {// Αποκτήστε κλειδαριά εάν δεν υπάρχουν αναγνώστες ή συγγραφείς
διακοπή; // επιτυχώς απέκτησε κλειδαριά εγγραφής
} αλλιώς {
// συνεχίστε να προσπαθείτε μέχρι να επιτύχετε ή να σηματοδοτήσετε την κατάσταση αναμονής
συνεχίζω; // spin-wait, δεν είναι ιδανικό για υψηλό ισχυρισμό
// Μια πιο εξελιγμένη έκδοση μπορεί να χρησιμοποιήσει μια μεταβλητή κατάστασης για να αποτρέψει την πολυάσχολη αναμονή.
}
}
}
void Release_Write () {
κλειδαριά =0; // Κλείδωμα απελευθέρωσης
}
// Λειτουργία βοηθού (αντικαταστήστε με τη σύγκριση και την ανταλλαγή της γλώσσας σας)
bool compare_and_swap (std ::atomic
επιστροφή στόχου-> compare_exchange_weak (αναμενόμενο, επιθυμητό);
}
};
int main () {
Multiplereadersinglewriterlock m;
// Παράδειγμα χρήσης
m.acquire_read ();
std ::cout <<"αναγνώστης 1 αποκτήθηκε κλειδαριά \ n";
m.release_read ();
std ::cout <<"Αναγνώστης 1 κυκλοφόρησε Lock \ n";
m.acquire_write ();
std ::cout <<"Ο συγγραφέας απέκτησε Lock \ n";
m.release_write ();
std ::cout <<"Ο συγγραφέας απελευθέρωσε το Lock \ n";
m.acquire_read ();
m.acquire_read ();
std ::cout <<"Αναγνώστης 2 και 3 αποκτήθηκε κλειδαριά \ n";
m.release_read ();
m.release_read ();
std ::cout <<"Αναγνώστης 2 και 3 απελευθέρωσης κλειδώματος \ n";
επιστροφή 0;
}
`` `
Σημαντικές εκτιμήσεις:
* Spinlocks: Οι μέθοδοι `acquire_write 'και` quare_read` χρησιμοποιούν busy-waiting (spinlocks). Αυτό είναι αναποτελεσματικό υπό υψηλό ισχυρισμό. Για τον κωδικό παραγωγής, αντικαταστήστε αυτό με μεταβλητές κατάστασης ή άλλα πρωταρχικά πρωταρχικά συγχρονισμού για να αποφευχθεί η σπατάλη κύκλων CPU.
* πείνα: Ενώ οι συγγραφείς έχουν προτεραιότητα, οι αναγνώστες ενδέχεται να εξακολουθούν να βιώνουν λιμοκτονία εάν υπάρχει μια συνεχής ροή συγγραφέων. Ένα πιο εξελιγμένο σύστημα αναμονής θα μπορούσε να βελτιώσει τη δικαιοσύνη.
* Ατομικές λειτουργίες: Η ορθότητα αυτής της κλειδαριάς εξαρτάται σε μεγάλο βαθμό από την ατομικότητα των εργασιών `compare_and_swap` και αύξησης/μείωσης. Βεβαιωθείτε ότι οι επιλεγμένες ατομικές λειτουργίες σας παρέχουν τις απαραίτητες εγγυήσεις.
* Χειρισμός σφαλμάτων: Μια ισχυρή εφαρμογή θα περιλαμβάνει χειρισμό σφαλμάτων (π.χ., έλεγχος τιμών επιστροφής από ατομικές λειτουργίες).
* Επιμελητικότητα: Για σενάρια υψηλής συγκέντρωσης, εξετάστε πιο προηγμένους μηχανισμούς κλειδώματος που έχουν σχεδιαστεί για καλύτερη επεκτασιμότητα.
Αυτό το βελτιωμένο παράδειγμα παρέχει μια πιο ισχυρή, αν και ακόμα απλοποιημένη, υλοποίηση. Για τα συστήματα παραγωγής, εξετάστε τη χρήση καθιερωμένων βιβλιοθηκών ή πλαισίων που παρέχουν καλά δοκιμασμένα και εξαιρετικά βελτιστοποιημένα πρωτόγονα συγχρονισμού. Θυμηθείτε ότι ο συγχρονισμός είναι πολύπλοκος και απαιτεί προσεκτική εξέταση των πιθανών συνθηκών αγώνων και των συμφόρων απόδοσης.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα