Προγραμματισμός

Τα δύο σεντ μου στο Mutex και το Semaphore στο C #

Ο συγχρονισμός νημάτων χρησιμοποιείται για να αποτρέψει την ταυτόχρονη πρόσβαση πολλών νημάτων σε έναν κοινόχρηστο πόρο. Το Mutex και το Semaphore είναι δύο από τις πιο σημαντικές σχετικές έννοιες. Ας καταλάβουμε τι είναι και τα δύο και πότε πρέπει να τα χρησιμοποιήσουμε.

Πριν ξεκινήσουμε τη συζήτησή μας, ας ρίξουμε μια γρήγορη ματιά στις βασικές έννοιες. Ένα νήμα είναι η μικρότερη μονάδα εκτέλεσης σε μια διαδικασία. Ουσιαστικά, το multi-threading σάς βοηθά να εκτελείτε πολλές εργασίες ταυτόχρονα και επομένως να αυξάνετε τη συνολική απόδοση της εφαρμογής.

Το Mutex είναι ένα πρωτόγονο συγχρονισμού που μπορεί να λειτουργήσει σε όλες τις διεργασίες - δηλαδή, μπορεί να χρησιμοποιηθεί για συγχρονισμό μεταξύ διεργασιών. Ένα Semaphore αντίθετα είναι αυτό που σας επιτρέπει να περιορίσετε τον αριθμό των νημάτων που έχουν πρόσβαση σε έναν κοινόχρηστο πόρο την ίδια χρονική στιγμή. Στην ουσία, το Semaphore είναι μια πιο γενικευμένη μορφή ενός Mutex.

Ένα Semaphore χρησιμοποιείται για τον περιορισμό του αριθμού των νημάτων που μπορούν να έχουν ταυτόχρονα πρόσβαση σε έναν κοινόχρηστο πόρο. Στην ουσία, χρησιμοποιείται για τον ταυτόχρονο περιορισμό του αριθμού των καταναλωτών για έναν συγκεκριμένο κοινόχρηστο πόρο. Μπορείτε να επωφεληθείτε από το Semaphore για να εφαρμόσετε μη αποκλειστικό κλείδωμα και επομένως να περιορίσετε την ταυτόχρονη σύνδεση.

Σημειώστε ότι το Mutex χρησιμοποιείται για αποκλειστικό κλείδωμα σε κοινόχρηστο πόρο. Με άλλα λόγια, ένα Mutex σάς επιτρέπει να αποκτάτε ένα αμοιβαία αποκλειστικό κλείδωμα - οποιοδήποτε νήμα θα έχει πρόσβαση σε έναν κοινόχρηστο πόρο σε μια δεδομένη χρονική στιγμή. Το αποκλειστικό κλείδωμα χρησιμοποιείται για να διασφαλίσει ότι σε οποιαδήποτε δεδομένη χρονική στιγμή, ένα και μόνο ένα νήμα μπορεί να εισέλθει σε μια κρίσιμη ενότητα. Μια κρίσιμη ενότητα μπορεί να οριστεί ως δομή δεδομένων ή πόρος που μοιράζεται από πολλά νήματα, αλλά ένα και μόνο ένα νήμα μπορεί να έχει πρόσβαση σε αυτό σε οποιαδήποτε δεδομένη χρονική στιγμή.

Η κλάση System.Threading.Mutex αντιπροσωπεύει ένα Mutex και το System.Threading.Semaphore class χρησιμοποιείται για εργασία με τους Semaphores. Μπορείτε να χρησιμοποιήσετε τη μέθοδο WaitOne σε μια παρουσία της κλάσης Mutex για να κλειδώσετε και να χρησιμοποιήσετε τη μέθοδο ReleaseMutex για ξεκλείδωμα.

Mutex mutexObject = νέο Mutex (false, "Demo");

εάν (! mutexObject.WaitOne (TimeSpan.FromSeconds (10), false))

     {

Console.WriteLine ("Η διακοπή για τώρα ως άλλη παρουσία βρίσκεται σε εκτέλεση ...");

ΕΠΙΣΤΡΟΦΗ;

     }

Για να δημιουργήσετε ένα Semaphore στο C #, θα πρέπει να δημιουργήσετε μια παρουσία της κλάσης Semaphore. Κατά τη δημιουργία μιας παρουσίας Semaphore, πρέπει να μεταβιβάσετε δύο ορίσματα στον κατασκευαστή ορίσματος. Ενώ το πρώτο όρισμα χρησιμοποιείται για να υποδείξει τον αριθμό των αρχικών καταχωρίσεων πόρου, το δεύτερο όρισμα χρησιμοποιείται για τον καθορισμό του μέγιστου αριθμού ταυτόχρονων καταχωρίσεων πόρων. Σημειώστε ότι εάν θέλετε να δεσμεύσετε όλες τις θέσεις για τα νέα νήματα που θα δημιουργηθούν, θα πρέπει να καθορίσετε τις ίδιες τιμές και για τις δύο αυτές παραμέτρους. Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να δημιουργήσετε ένα σηματοφόρο στο C #.

δημόσιο στατικό Semaphore threadPool = νέο Semaphore (3, 5);

Ανατρέξτε στο απόσπασμα κώδικα που δίνεται παραπάνω. Η παραπάνω δήλωση δημιουργεί ένα αντικείμενο semaphore που ονομάζεται threadPool που μπορεί να υποστηρίξει έως 5 ταυτόχρονες αιτήσεις. Σημειώστε ότι η αρχική μέτρηση ορίζεται σε 3 όπως υποδεικνύεται στην πρώτη παράμετρο στον κατασκευαστή. Αυτό σημαίνει ότι 2 υποδοχές προορίζονται για το τρέχον νήμα και 3 διαθέσιμες θέσεις για άλλα θέματα. Ας γράψουμε τώρα κάποιο κώδικα!

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να δημιουργήσετε και να ξεκινήσετε 10 νήματα χρησιμοποιώντας την κλάση νήματος που είναι διαθέσιμη στο σύστημα. Σημειώστε πώς έχει χρησιμοποιηθεί ο εκπρόσωπος του ThreadStart.

για (int i = 0; i <10; i ++)

{

Thread threadObject = νέο νήμα (νέο ThreadStart (PerformSomeWork));

threadObject.Name = "Όνομα νημάτων:" + i;

threadObject.Start ();

}

Εδώ είναι ο κωδικός της μεθόδου PerformSomeWork. Αυτή είναι η μέθοδος που περιέχει πραγματικά τον κώδικα για την εργασία με σηματοφόρους.

ιδιωτικό στατικό κενό PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Το νήμα {0} βρίσκεται μέσα στην κρίσιμη ενότητα ...", Thread.CurrentThread.Name);

Νήμα. Sleep (10000);

threadPool.Release ();

       }

Ανατρέξτε στη μέθοδο PerformSomeWork που αναφέρεται παραπάνω. Η μέθοδος WaitOne καλείται στην παρουσία Semaphore για να μπλοκάρει το τρέχον νήμα έως ότου ληφθεί σήμα Η μέθοδος απελευθέρωσης καλείται στην ίδια παρουσία για να απελευθερώσει το σηματοφόρο. Ακολουθεί η πλήρης λίστα κωδικών για την αναφορά σας.

τάξη SemaphoreDemo

   {

δημόσιο στατικό Semaphore threadPool = νέο Semaphore (3, 5);

δημόσιο στατικό κενό Κεντρικό (string [] args)

       {

για (int i = 0; i <10; i ++)

           {

Thread threadObject = νέο νήμα (νέο ThreadStart (PerformSomeWork));

threadObject.Name = "Όνομα νημάτων:" + i;

threadObject.Start ();

           }

Console.ReadLine ();

       }

ιδιωτικό στατικό κενό PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Το νήμα {0} βρίσκεται μέσα στην κρίσιμη ενότητα ...", Thread.CurrentThread.Name);

Νήμα. Sleep (10000);

threadPool.Release ();

       }

   }