έννοιες που σχετίζονται με νήματα 1. Συγχρονισμός νήματος Χειροκίνητη επαναφορά συμβάντος Η μέθοδος Set() ορίζει την κατάσταση σε Signaled Reset() για να το ρυθμίσετε σε κανένα σήμα Το WaitOne() θα μπλοκάρει μέχρι να έχει σήμα και εάν υπάρχει σήμα τη στιγμή της κλήσης του WaitOne, δεν θα μπλοκάρει Αυτόματη επαναφορά συμβάντος Η διαφορά από το ManualResetEvent είναι ότι το AutoResetEvent.WaitOne() αλλάζει αυτόματα την κατάσταση του αντικειμένου συμβάντος, δηλαδή η κατάσταση του συμβάντος αλλάζει κάθε φορά που εκτελείται το AutoResetEvent.WaitOne(). Σήμα - > χωρίς σήμα, Χωρίς σήμα – > έχει σήμα
example:
myResetEven.Set(), η οποία είναι στην πραγματικότητα ισοδύναμη με έναν διακόπτη, εάν η μέθοδος set() δεν εκτελεστεί, η ακόλουθη waitOne() δεν θα μπορεί να περιμένει την ειδοποίηση για να την αφήσει να εκτελεστεί, έτσι ώστε η δήλωση μετά το waitOne να μην εκτελεστεί. Μέθοδος παρακολούθησης Ο μηχανισμός Wait() Pulse() χρησιμοποιείται για αλληλεπίδραση μεταξύ νημάτων, όταν ένα αντικείμενο εκπέμπει Monitor.Wait(), το νήμα που έχει πρόσβαση στο αντικείμενο θα παραμείνει σε κατάσταση αναμονής. μέχρι να πάρει σήμα αφύπνισης. Το Monitor.Pulse() χρησιμοποιείται για την αποστολή σημάτων στο νήμα αναμονής. Δηλαδή, στην κρίσιμη περιοχή μεταξύ Monitor.Enter() και Monitor.Exit(), για να απελευθερώσετε το κλείδωμα στο αντικείμενο και να αποκλείσετε το τρέχον νήμα, βρίσκεται σε κατάσταση αναμονής στην ουρά.
Η κλειδαριά είναι διαφορετική από τη Mutex Κλείδωμα συγχρονισμού μεταξύ πολλαπλών νημάτων Συγχρονισμός πολλαπλών νημάτων μεταξύ διεργασιών Mutex ή συγχρονισμός πολλαπλών διεργασιών Στον προγραμματισμό πολλαπλών νημάτων .Net, χρησιμοποιούνται συχνά οι AutoResetEvent και ManualResetEvent και η χρήση τους είναι πολύ παρόμοια, αλλά υπάρχουν διαφορές. Η μέθοδος Set θέτει το σήμα στην κατάσταση αποστολής, η μέθοδος Reset θέτει το σήμα στην κατάσταση μη αποστολής και το WaitOne περιμένει να σταλεί το σήμα. Η αρχική κατάσταση του κατασκευαστή μπορεί να προσδιοριστεί από την τιμή της παραμέτρου, εάν είναι αληθής, δεν μπλοκάρει και false είναι η κατάσταση αποκλεισμού. Εάν ένα νήμα καλέσει τη μέθοδο WaitOne, το νήμα λαμβάνει το σήμα όταν βρίσκεται σε κατάσταση αποστολής και συνεχίζει να εκτελείται προς τα κάτω. Η διαφορά είναι ότι μετά την κλήση, το AutoResetEvent.WaitOne() επιτρέπει την είσοδο μόνο ενός νήματος κάθε φορά και όταν ένα νήμα λαμβάνει σήμα, το AutoResetEvent θα θέσει αυτόματα το σήμα σε κατάσταση μη αποστολής και τα άλλα νήματα που καλούν το WaitOne μπορούν μόνο να συνεχίσουν να περιμένουν. Δηλαδή, το AutoResetEvent ξυπνά μόνο ένα νήμα κάθε φορά. Το ManualResetEvent μπορεί να ξυπνήσει πολλά νήματα, επειδή όταν ένα νήμα καλεί τη μέθοδο ManualResetEvent.Set(), τα άλλα νήματα που καλούν το WaitOne λαμβάνουν το σήμα για να συνεχίσουν την εκτέλεση και το ManualResetEvent δεν ορίζει αυτόματα το σήμα ώστε να μην αποστέλλεται. Με άλλα λόγια, εκτός εάν η μέθοδος ManualResetEvent.Reset() καλείται χειροκίνητα, το ManualResetEvent θα παραμείνει σηματοδοτημένο και το ManualResetEvent μπορεί να ξυπνήσει πολλά νήματα ταυτόχρονα για να συνεχίσει την εκτέλεση. |