Για να κατανοήσουμε το σπείρωμα στο VB.NET, βοηθάει στην κατανόηση κάποιων από τις έννοιες θεμελίωσης. Πρώτα επάνω είναι ότι threading είναι κάτι που συμβαίνει επειδή το λειτουργικό σύστημα το υποστηρίζει. Τα Microsoft Windows είναι ένα προληπτικό πολυλειτουργικό λειτουργικό σύστημα. Ένα τμήμα των Windows που ονομάζεται χρονοπρογραμματιστής εργασιών αποζημιώνει τον χρόνο του επεξεργαστή σε όλα τα τρέχοντα προγράμματα. Αυτά τα μικρά κομμάτια του χρόνου επεξεργαστή ονομάζονται φέτες χρόνου. Τα προγράμματα δεν είναι υπεύθυνα για τον χρόνο επεξεργασίας που έχουν, ο χρονοπρογραμματιστής εργασιών. Επειδή αυτές οι φέτες του χρόνου είναι τόσο μικρές, παίρνετε την ψευδαίσθηση ότι ο υπολογιστής κάνει πολλά πράγματα ταυτόχρονα.
Ορισμός του νήματος
Ένα νήμα είναι μία διαδοχική ροή ελέγχου.
Μερικοί προκριματικοί:
- Ένα νήμα είναι μια "διαδρομή εκτέλεσης" μέσω αυτού του σώματος κώδικα.
- Τα νήματα μοιράζονται τη μνήμη, ώστε να συνεργάζονται για να παράγουν το σωστό αποτέλεσμα.
- Ένα νήμα έχει δεδομένα ειδικά για νήμα, όπως καταχωρητές, δείκτη στοίβας και μετρητή προγραμμάτων.
- Μια διαδικασία είναι ένα ενιαίο σώμα κώδικα που μπορεί να έχει πολλά θέματα, αλλά έχει τουλάχιστον ένα και έχει ένα ενιαίο πλαίσιο (χώρο διεύθυνσης).
Αυτό είναι πράγματα επίπεδο συναρμολόγησης, αλλά αυτό είναι που παίρνετε όταν αρχίζετε να σκέφτεστε για θέματα.
Multithreading vs. Πολυεπεξεργασία
Πολλαπλασιασμός δεν είναι η ίδια με την πολύπλευρη παράλληλη επεξεργασία, αλλά η πολυεπεξεργασία και η πολυεπεξεργασία δουλεύουν μαζί. Οι περισσότεροι υπολογιστές σήμερα διαθέτουν επεξεργαστές που έχουν τουλάχιστον δύο πυρήνες και οι συνηθισμένες μηχανές σπιτιού έχουν μερικές φορές μέχρι και οκτώ πυρήνες. Κάθε πυρήνας είναι ένας ξεχωριστός επεξεργαστής, ικανός να εκτελεί προγράμματα από μόνο του. Παίρνετε αύξηση της απόδοσης όταν το λειτουργικό σύστημα εκχωρεί διαφορετική διαδικασία σε διαφορετικούς πυρήνες. Η χρήση πολλαπλών κλώνων και πολλαπλών επεξεργαστών για ακόμα μεγαλύτερη απόδοση ονομάζεται παραλληλισμός σε επίπεδο νήματος.
Πολλά από αυτά που μπορούν να γίνουν εξαρτώνται από το τι μπορεί να κάνει το λειτουργικό σύστημα και το υλικό του επεξεργαστή, όχι πάντα τι μπορείτε να κάνετε στο πρόγραμμά σας και δεν πρέπει να περιμένετε να μπορείτε να χρησιμοποιήσετε πολλαπλά θέματα τα παντα. Στην πραγματικότητα, ίσως να μην βρείτε πολλά προβλήματα που επωφελούνται από πολλαπλά θέματα. Γι 'αυτό, μην εφαρμόζετε πολλαπλές λέξεις μόνο επειδή είναι εκεί. Μπορείτε να μειώσετε εύκολα την απόδοση του προγράμματός σας αν δεν είναι καλός υποψήφιος για πολλαπλούς τρόπους. Ακριβώς ως παραδείγματα, οι κωδικοποιητές βίντεο μπορεί να είναι τα χειρότερα προγράμματα για πολλαπλά στρώματα, επειδή τα δεδομένα είναι εγγενώς κατα συρροη. Τα προγράμματα διακομιστών που χειρίζονται ιστοσελίδες μπορεί να είναι μεταξύ των καλύτερων επειδή οι διαφορετικοί πελάτες είναι εγγενώς ανεξάρτητοι.
Ασκήσεις Ασφάλειας Νήματος
Ο πολυνηματικός κώδικας συχνά απαιτεί πολύπλοκο συντονισμό των κλωστών. Τα λεπτά και δύσκολα να εντοπιστούν σφάλματα είναι κοινά, επειδή τα διαφορετικά νήματα συχνά πρέπει να μοιράζονται τα ίδια δεδομένα, έτσι ώστε τα δεδομένα να μπορούν να αλλάζουν από ένα νήμα όταν το άλλο δεν το περιμένει. Ο γενικός όρος για αυτό το πρόβλημα είναι "η κατάσταση του αγώνα". Με άλλα λόγια, τα δύο νήματα μπορούν να μπουν σε μια "φυλή" για να ενημερώσουν τα ίδια δεδομένα και το αποτέλεσμα μπορεί να είναι διαφορετικό ανάλογα με το ποιο νήμα "κερδίζει". Ως ασήμαντο παράδειγμα, ας υποθέσουμε ότι κωδικοποιείτε ένα βρόχο:
Εάν ο μετρητής βρόχου «εγώ» απροσδόκητα χάσει τον αριθμό 7 και πηγαίνει από 6 σε 8 - αλλά μόνο μερικές φορές - θα είχε καταστροφικά αποτελέσματα σε ό, τι κάνει ο βρόχος. Η πρόληψη τέτοιων προβλημάτων ονομάζεται ασφάλεια νήματος. Εάν το πρόγραμμα χρειάζεται το αποτέλεσμα μιας λειτουργίας σε μια μεταγενέστερη λειτουργία, τότε μπορεί να είναι αδύνατο να κωδικοποιήσετε παράλληλες διαδικασίες ή θέματα για να το κάνετε.
Βασικές λειτουργίες πολλαπλών ρυθμίσεων
Ήρθε η ώρα να προωθήσετε αυτή την προληπτική ομιλία στο παρασκήνιο και να γράψετε κάποιο κώδικα πολλαπλών θορύβων. Αυτό το άρθρο χρησιμοποιεί μια εφαρμογή κονσόλας για απλότητα αυτή τη στιγμή. Αν θέλετε να ακολουθήσετε, ξεκινήστε το Visual Studio με ένα νέο έργο Application Console.
Το πρωτεύον πεδίο ονομάτων που χρησιμοποιείται από το multithreading είναι το σύστημα. Ο χώρος ονομάτων Threading και η κλάση Thread δημιουργούν, ξεκινούν και σταματούν νέα θέματα. Στο παρακάτω παράδειγμα, παρατηρήστε ότι το TestMultiThreading είναι εκπρόσωπος. Δηλαδή, πρέπει να χρησιμοποιήσετε το όνομα μιας μεθόδου που μπορεί να καλέσει η μέθοδος Thread.
Σε αυτήν την εφαρμογή, θα μπορούσαμε να εκτελέσουμε το δεύτερο Sub απλά κάνοντας κλήση:
Αυτό θα είχε εκτελέσει ολόκληρη την εφαρμογή με σειριακό τρόπο. Το πρώτο παράδειγμα κώδικα παραπάνω, ωστόσο, ξεκινάει από την υπορουτίνα TestMultiThreading και στη συνέχεια συνεχίζεται.
Παράδειγμα αναδρομικού αλγορίθμου
Ακολουθεί μια εφαρμογή πολλαπλών σκελών που περιλαμβάνει τον υπολογισμό των μεταλλαγών μιας συστοιχίας χρησιμοποιώντας έναν αναδρομικό αλγόριθμο. Δεν εμφανίζεται ολόκληρος ο κωδικός εδώ. Η συστοιχία χαρακτήρων που μετατρέπονται είναι απλά "1", "2", "3", "4" και "5". Εδώ είναι το σχετικό μέρος του κώδικα.
Παρατηρήστε ότι υπάρχουν δύο τρόποι για να καλέσετε το Permute sub (και οι δύο σχολιάστηκαν στον παραπάνω κώδικα). Κάποιος ξεκινά ένα νήμα και ο άλλος τον καλεί απευθείας. Αν το καλέσετε άμεσα, θα έχετε:
Ωστόσο, αν ξεκινήσετε ένα νήμα και ξεκινήστε το Permute sub αντί, παίρνετε:
Αυτό δείχνει σαφώς ότι παράγεται τουλάχιστον μία μετάθεση, τότε το Main sub κινείται μπροστά και τελειώνει, εμφανίζοντας το "Finished Main", ενώ παράγονται οι υπόλοιπες παραλλαγές. Δεδομένου ότι η οθόνη προέρχεται από ένα δεύτερο υπομενού που καλείται από το Permute sub, ξέρετε ότι είναι μέρος του νέου νήματος επίσης. Αυτό απεικονίζει την έννοια ότι ένα νήμα είναι "μια πορεία εκτέλεσης" όπως αναφέρθηκε προηγουμένως.
Παράδειγμα κατάστασης αγώνα
Το πρώτο μέρος αυτού του άρθρου ανέφερε μια κατάσταση κούρσας. Ακολουθεί ένα παράδειγμα που το δείχνει άμεσα:
Το παράθυρο "Άμεση" έδειξε αυτό το αποτέλεσμα σε μία δοκιμή. Άλλες δοκιμές ήταν διαφορετικές. Αυτή είναι η ουσία μιας φυλής.