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

Άποψη: 49134|Απάντηση: 4

[Πηγή] Το .NET/C# Lock Principle Monitor παρέχει μια εις βάθος εξήγηση

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 29/4/2021 9:54:10 π.μ. | | | |
Η εντολή κλειδώματος παίρνει το mutex ενός δεδομένου αντικειμένου, εκτελεί ένα μπλοκ εντολών και, στη συνέχεια, απελευθερώνει το κλείδωμα. Όταν κρατάτε μια κλειδαριά, το νήμα που συγκρατεί την κλειδαριά μπορεί να αποκτήσει και να απελευθερώσει ξανά την κλειδαριά. Οποιοδήποτε άλλο νήμα εμποδίζεται να πάρει την κλειδαριά και περιμένει μέχρι να απελευθερωθεί η κλειδαριά.

Αναθεώρηση:

.net/c# Κλείδωμα συγχρονισμού πολλαπλών νημάτων χρήστη(string){...} Λεπτομερής εξήγηση
https://www.itsvse.com/thread-7764-1-1.html

Χρήση του κωδικού κλειδώματος

Ισοδύναμο με

Μπορεί να θεωρηθεί ότι ο υποκείμενος κώδικας του Lock υλοποιείται από το Monitor.

Δεδομένου ότι ο κώδικας χρησιμοποιεί δοκιμάσει... final, οπότε ακόμα κι αν προστεθεί μια εξαίρεση στο σώμα της δήλωσης κλειδώματος, η κλειδαριά απελευθερώνεται.

Δεν μπορείτε να χρησιμοποιήσετε το κλείδωμα τελεστή αναμονής στο σώμα της δήλωσης.Δεν μπορείτε να το χρησιμοποιήσετε στο σώμα της δήλωσηςΠεριμένετεΚλειδαριά χειριστή。 Δεν μπορείτε να χρησιμοποιήσετε το κλείδωμα τελεστή αναμονής στο σώμα της δήλωσης. Δεν μπορείτε να χρησιμοποιήσετε το κλείδωμα τελεστή αναμονής στο σώμα της δήλωσης. Αυτή η πρόταση είναι πολύ σημαντική!

Τεκμηρίωση:Η σύνδεση με υπερσύνδεσμο είναι ορατή.

Δοκιμάζω τον κώδικα μόνος μου,Χρησιμοποιήστε το Task για να λάβετε το κλείδωμα και χρησιμοποιήστε το wait για αποκλεισμό, ο κωδικός έχει ως εξής:

Μετά την εκτέλεση του παρακάτω κώδικα αρκετές φορές, το αποτέλεσμα εκτέλεσης δεν είναι το αναμενόμενο.



Γιατί? Εάν προσπαθήσετε να χρησιμοποιήσετε τη λέξη-κλειδί αναμονής όταν προσπαθείτε να χρησιμοποιήσετε τη λέξη-κλειδί αναμονής στο μπλοκ κλειδώματος, θα λάβετε αυτό το σφάλμα μεταγλώττισης: δεν είναι δυνατή η αναμονή στο σώμα μιας δήλωσης κλειδώματος. Ο λόγος είναι ότι μετά την ολοκλήρωση της αναμονής, η μέθοδος μπορεί να εκτελεστεί σε διαφορετικό νήμα αντί για το νήμα (νήμα κλήσης) πριν από τη λέξη-κλειδί αναμονής.lockλέξη-κλειδίίδιο νήμαΚλειδώστε και απελευθερώστε το κλείδωμα στην κλειδαριά
Τροποποιήστε τον κώδικα για να δείτε τον λόγο πιο διαισθητικά:

Λάβετε το αναγνωριστικό σπειρώματος της κλειδαριάς και το αναγνωριστικό σπειρώματος της απελευθέρωσης κλειδαριάς,Προφανώς όχι σε ένα νήμα, επομένως η κλειδαριά δεν μπορεί να απελευθερωθεί με επιτυχία, όπως φαίνεται στο παρακάτω σχήμα:



Προσπάθησα να τροποποιήσω τον κώδικα, δοκιμάσαμε με νήμα, εκτελέσαμε πολλές φορές και λειτούργησε όπως αναμενόταν, ο κώδικας έχει ως εξής:



(Τέλος)





Προηγούμενος:(to).NET/C# για να συσκευάσετε το φάκελο σε ένα αρχείο zip
Επόμενος:Το Redis χρησιμοποιεί σενάρια Lua για λεπτομερείς εξηγήσεις
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 10/2/2022 9:20:09 π.μ. |

Μην απελευθερώνετε την κλειδαριά





 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 25/6/2023 7:57:43 μ.μ. |
Η μέθοδος συγχρονισμού αντικειμένων κλήθηκε από ένα μη συγχρονισμένο μπλοκ κώδικα.
Ο παρακάτω κώδικας θα δώσει ένα σφάλμα όπως παραπάνω




 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 12/8/2023 7:47:49 μ.μ. |
Lock Syntax Sugar, όπως φαίνεται παρακάτω:






 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 11/7/2024 10:44:02 π.μ. |
【Στροφή】C# ταυτόχρονος συγχρονισμός πολλαπλών νημάτων κάτω από διάφορες κλειδαριές
https://www.itsvse.com/thread-10561-1-1.html
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com