Περιγραφή των όρων ανταγωνισμού και προβλήματα

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 317723 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Visual Basic .NET ή Visual Basic 2005 προσφέρει τη δυνατότητα χρήσης των νημάτων σε εφαρμογές της Visual Basic για πρώτη φορά. Νήματα εισάγουν ζητήματα εντοπισμού σφαλμάτων όπως καταστάσεις ανταγωνισμού και προβλήματα. Αυτό το άρθρο εξετάζει τα δύο αυτά θέματα.

Περισσότερες πληροφορίες

Καταστάσεις ανταγωνισμού

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

Παράδειγμα και λεπτομέρειες

Κάθε νήμα έχει εκχωρηθεί μια προκαθορισμένη περίοδο χρόνου εκτέλεσης σε έναν επεξεργαστή. Όταν λήξει ο χρόνος που έχει εκχωρηθεί για το νήμα, το περιβάλλον του νήματος αποθηκεύονται μέχρι την επόμενη σειρά τον εκτελούντα την επεξεργασία και ο επεξεργαστής αρχίζει την εκτέλεση του επόμενου νήματος.

Πώς μια εντολή μίας γραμμής μπορεί να προκαλέσει μια κατάσταση κούρσας; Εξετάστε το παράδειγμα που ακολουθεί, για να δείτε τον τρόπο που εκτελείται μια κατάσταση κούρσας. Υπάρχουν δύο νήματα και και τα δύο να ενημερώσετε μια μεταβλητή κοινόχρηστο καλείται συνολικό (που αναπαρίσταται ως dword ptr ds: [031B49DCh] στον κώδικα συγκρότησης).

Κώδικα της Visual Basic:
   'Thread 1
   Total = Total + val1
				
   'Thread 2
   Total = Total - val2
				
Συγκρότηση κώδικα (με αριθμούς γραμμών) από την κατάρτιση τον παραπάνω κώδικα Visual Basic:
 'Thread 1
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   add         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        7611097F 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
 'Thread 2
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   sub         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        76110BE7 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
Κοιτάζοντας στη συγκρότηση κώδικα, μπορείτε να δείτε πόσες λειτουργίες ο επεξεργαστής εκτελεί στο χαμηλότερο επίπεδο για να εκτελέσετε έναν υπολογισμό απλή Προσθήκη. Ένα νήμα μπορεί να είναι δυνατή η εκτέλεση ολόκληρο ή μέρος του κώδικά του συγκροτήματος κατά το χρόνο τον εκτελούντα την επεξεργασία. Τώρα δείτε πώς μια κατάσταση κούρσας προκύπτει από αυτόν τον κωδικό.

Σύνολο είναι 100, τιμή1 είναι 50 και τιμή2 είναι 15. Νήμα 1 λαμβάνει μια ευκαιρία για την εκτέλεση, αλλά μόνο να ολοκληρώσει τα βήματα 1 έως 3. Αυτό σημαίνει ότι το νήμα 1 Διαβάστε τη μεταβλητή και ολοκληρωθεί η προσθήκη. Το νήμα 1 τώρα απλά περιμένει να εγγραφεί η νέα τιμή 150. Μετά τη διακοπή του νήματος 1, 2 νήματος λαμβάνει για την εκτέλεση πλήρως. Αυτό σημαίνει ότι το έχει εγγραφεί η τιμή αυτή υπολογίζεται (85) καθορίζονται στο σύνολο μεταβλητών. Τέλος, το νήμα 1 ανακτήσει τον έλεγχο και την ολοκλήρωση της εκτέλεσης. Εγγραφή την τιμή (150). Επομένως, όταν ολοκληρωθεί το νήμα 1, η τιμή του συνολικού είναι τώρα 150 αντί 85.

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

Αυτό το σφάλμα είναι τυχαίο, επειδή είναι δυνατή για το νήμα 1 για την ολοκλήρωση της εκτέλεσής του, πριν από την ώρα στο λήγει ο επεξεργαστής και στη συνέχεια νήματος 2 μπορεί να ξεκινήσει την εκτέλεση. Αν συμβαίνουν αυτά τα συμβάντα, το πρόβλημα δεν παρουσιάζεται. Οι μη προσδιοριστικές εκτέλεσης νήματος, επομένως δεν μπορείτε να ελέγξετε την ώρα ή τη σειρά εκτέλεσης. Σημειώστε επίσης ότι τα νήματα μπορούν να εκτελούνται με διαφορετικό τρόπο στο περιβάλλον χρόνου εκτέλεσης σε σχέση με την κατάσταση λειτουργίας εντοπισμού σφαλμάτων. Επίσης, μπορείτε να δείτε ότι εάν μπορείτε να εκτελέσετε κάθε νήμα σε σειρά, το σφάλμα δεν παρουσιάζεται. Η τυχαία εναλλαγή καθιστά πολύ πιο δύσκολο να εντοπίσετε και να διορθώσετε αυτά τα σφάλματα.

Για να αποτρέψετε την εμφάνιση των όρων ανταγωνισμού, μπορείτε να κλειδώσετε κοινόχρηστο μεταβλητές, έτσι ώστε μόνο ένα νήμα κάθε φορά να έχει πρόσβαση στη μεταβλητή κοινόχρηστο. Αυτό το επιτυγχάνετε με φειδώ, επειδή εάν μια μεταβλητή είναι κλειδωμένη στο νήμα 1 και 2 νήματος πρέπει επίσης τη μεταβλητή, η εκτέλεση του νήματος 2 σταματά κατά την αναμονή του νήματος 2 για το νήμα 1 για να αφήσετε τη μεταβλητή. (Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα "SyncLock" στην ενότητα "Αναφορές" αυτού του άρθρου.)

Συμπτώματα

Το πιο κοινό σύμπτωμα για μια κατάσταση ανταγωνισμού είναι απρόβλεπτες τιμές των μεταβλητών που είναι κοινόχρηστες μεταξύ πολλών νημάτων. Αυτό έχει ως αποτέλεσμα από τον απρόβλεπτο παράγοντα να τη σειρά με την οποία εκτελούνται τα νήματα. Κάποια στιγμή ένα νήμα wins και κάποια στιγμή το άλλο νήμα wins. Άλλες φορές, εκτέλεση λειτουργεί σωστά. Επίσης, εάν εκτελείται ξεχωριστά κάθε νήμα, την τιμή μεταβλητής συμπεριφέρεται σωστά.

Προβλήματα

Παρουσιάζεται αδιέξοδο όταν δύο νήματα κάθε κλειδώσετε μια διαφορετική μεταβλητή ταυτόχρονα και στη συνέχεια προσπαθήστε να κλειδώσετε τη μεταβλητή που ήδη κλειδωμένος άλλο νήμα. Ως αποτέλεσμα, κάθε νήμα σταματά η εκτέλεση και περιμένει άλλο νήμα για να αφήσετε τη μεταβλητή. Επειδή κάθε νήμα κρατά τη μεταβλητή που θέλει άλλο νήμα, δεν συμβαίνει τίποτα, και τα νήματα παραμένουν αδιεξόδου.

Παράδειγμα και λεπτομέρειες

Ο κώδικας που ακολουθεί έχει δύο αντικείμενα, LeftVal και RightVal:
'Thread 1
SyncLock LeftVal
 SyncLock RightVal
  'Perform operations on LeftVal and RightVal that require read and write.
 End SyncLock
End SyncLock
				
'Thread 2
SyncLock RightVal
 SyncLock LeftVal
  'Perform operations on RightVal and LeftVal that require read and write.
 End SyncLock
End SyncLock
				
Παρουσιάζεται αδιέξοδο όταν το νήμα 1 επιτρέπεται να κλειδώσετε LeftVal. Ο επεξεργαστής σταματά η εκτέλεση του νήματος 1 και αρχίζει η εκτέλεση του νήματος 2. Το νήμα 2 κλειδώματα RightVal και, στη συνέχεια, επιχειρεί να κλειδώσετε LeftVal. Επειδή LeftVal είναι κλειδωμένο, το νήμα 2 σταματά και περιμένει LeftVal προς κοινοποίηση. Επειδή το νήμα 2 έχει διακοπεί, νήμα 1 επιτρέπεται να συνεχιστεί η εκτέλεση. Το νήμα 1 προσπαθεί να κλειδώσετε RightVal αλλά δεν είναι δυνατή, επειδή έχει κλειδωθεί από το νήμα 2. Ως αποτέλεσμα, το νήμα 1 ξεκινά να περιμένετε μέχρι να διατεθεί RightVal. Κάθε νήμα περιμένει από άλλο νήμα, επειδή κάθε νήμα έχει κλειδώσει τη μεταβλητή που είναι σε αναμονή από άλλο νήμα, και κανένα νήμα ξεκλείδωμα η μεταβλητή που το κατέχει.

Δεν παρουσιάζεται πάντα μια αδιέξοδη κατάσταση. Εάν το νήμα 1 εκτελεί δύο κλειδώματα πριν τερματίζει τον επεξεργαστή, νήματος 1 μπορεί να εκτελεί τις λειτουργίες και να ξεκλειδώσετε στη συνέχεια τη μεταβλητή κοινόχρηστο. Αφού το νήμα 1 ξεκλειδώνει τη μεταβλητή, νήματος 2 να προχωρήσετε με την εκτέλεση, όπως αναμένεται.

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

Συμπτώματα

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

Τι είναι ένα νήμα;

Διαδικασίες που χρησιμοποιούνται για να διαχωρίσετε τις διαφορετικές εφαρμογές που εκτελούνται σε συγκεκριμένη ώρα σε έναν υπολογιστή. Το λειτουργικό σύστημα δεν εκτελεί διεργασίες, αλλά χωρίς τα νήματα. Ένα νήμα είναι μια μονάδα εκτέλεσης. Το λειτουργικό σύστημα εκχωρεί χρόνο επεξεργαστή σε ένα νήμα για την εκτέλεση των καθηκόντων του νήματος. Μια απλή διαδικασία μπορεί να περιέχει πολλά νήματα της εκτέλεσης. Κάθε νήμα διατηρεί το δικό του δείκτες χειρισμού εξαιρέσεων, Προγραμματισμός προτεραιότητες, καθώς και ένα σύνολο των δομών που χρησιμοποιεί το λειτουργικό σύστημα για να αποθηκεύσετε το περιβάλλον του νήματος, εάν το νήμα δεν μπορεί να ολοκληρώσει την εκτέλεση κατά το χρονικό διάστημα που είχε εκχωρηθεί στον επεξεργαστή. Το περιβάλλον είναι σε αναμονή μέχρι την επόμενη φορά που το νήμα λαμβάνει το χρόνο επεξεργαστή. Πλαίσιο περιλαμβάνει όλες τις πληροφορίες που είναι ότι το νήμα απαιτεί να συνεχίσετε χωρίς δυσκολία την εκτέλεση. Αυτές οι πληροφορίες περιλαμβάνουν το νήμα σύνολο των καταχωρητών του επεξεργαστή και της στοίβας κλήσεων στο εσωτερικό του χώρου διευθύνσεων της διαδικασίας κεντρικού υπολογιστή.

Αναφορές

Για περισσότερες πληροφορίες, αναζητήστε βοήθεια Visual Studio για τις ακόλουθες λέξεις-κλειδιά:
  • SyncLock. Επιτρέπει σε ένα αντικείμενο για να είναι κλειδωμένο. Εάν κάποιο άλλο νήμα προσπαθεί να κλειδώσετε το ίδιο αντικείμενο, είναι ανενεργό μέχρι το πρώτο νήμα για ενημερωμένες εκδόσεις. Χρησιμοποιήστε SyncLock προσεκτικά, επειδή τα προβλήματα μπορεί να προκύψουν από την κακή χρήση των SyncLock. Για παράδειγμα, αυτή η εντολή μπορεί να εμποδίζουν τις συνθήκες ανταγωνισμού αλλά να προκαλέσει προβλήματα.
  • Αλληλοσυνδεόμενα σύμβολα. Επιτρέπει σε ένα επιλεγμένο σύνολο λειτουργιών ασφάλειας νήματος σε βασικές αριθμητικές μεταβλητές.
Για πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
316422 ΠΛΗΡΟΦΟΡΙΕΣ: Οδηγίες για τη δημιουργία νημάτων σε Visual Basic .NET
Για περισσότερες πληροφορίες, ανατρέξτε στην ακόλουθη τοποθεσία του MSDN στο Web:
Νήματα και νήματα

Ιδιότητες

Αναγν. άρθρου: 317723 - Τελευταία αναθεώρηση: Τρίτη, 29 Οκτωβρίου 2013 - Αναθεώρηση: 5.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Λέξεις-κλειδιά: 
kbvs2005swept kbvs2005applies kbinfo kbmt KB317723 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο έχει μεταφραστεί χρησιμοποιώντας λογισμικό μηχανικής μετάφρασης της Microsoft και μπορείτε να το διορθώσετε χρησιμοποιώντας την τεχνολογία Community Translation Framework (CTF) (Πλαίσιο μετάφρασης κοινότητας). Η Microsoft παρέχει μηχανική μετάφραση, επεξεργασία μετά τη μηχανική μετάφραση από την κοινότητα και άρθρα μεταφρασμένα από επαγγελματίες προκειμένου να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής βάσης σε πολλές γλώσσες. Τα άρθρα μηχανικής μετάφρασης και αυτά που επεξεργάζονται ύστερα από μηχανική μετάφραση ενδέχεται να περιέχουν σφάλματα στο λεξιλόγιο, στη σύνταξη ή/και στη γραμματική. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες μας. Για περισσότερες πληροφορίες σχετικά με το CTF, μεταβείτε στην τοποθεσία http://support.microsoft.com/gp/machine-translation-corrections/el.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη: 317723

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com