Προς το περιεχόμενο

Συγχρονισμος Τhead στη c#


GlobeXgr

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας, τι ενναλακτικες έχω για να συγχρονίσω 2 thread στη c# εκτός από την suspend - resume. Εχω δυο threads που τρέχουν τον ιδιο κώδικα και θέλω να σταματάνε στο ιδιο σημείο και τα δυο. Μετά θα καλούν μια συνάρτηση και θα τους λέει να συνεχίσουν. any ideas on that one?

 

Ευχαριστώ.

Δημοσ.

Δες λίγο την μέθοδο Join της Thread.

 

H μέθοδος join περιμένει να τελειώσουν τα τhreds τη λειτουργία τους. Στο δικό μου κώδικα τα threads τρεχουν μια συνάρτηση καπως έτσι.

 

void func ()

{

while ()

{

//code here

check();

}

}

 

Θελω και για τα δυο threads να εκτελείτε η συναρτηση check οταν φτάσουν σε κάποιο συγκεκριμένο σημείο. Επίσης πως μπορώ να έχω ενα αντικείμενο static να χρησημοποιείτε απο ένα thread αποκλιστικά???

Δημοσ.

Κάνε :

 

>
void func1()
{
 while ()
 {
   //code here
 }
}

void func2()
{
 check();
}


void main()
{
   Thread t1 = new Thread(func1), t2 = new Thread(func1), ...;

   t1.Start();
   t2.Start();

   t1.Join();
   t2.Join();


   t1 = new Thread(func2);
   t2 = new Thread(func2);

   t1.Start();
   t2.Start();

   t1.Join();
   t2.Join();
}

Δημοσ.

Θα μπορούσες να έχεις flags (ένα array με τόσα flags όσα και τα thread που έχεις) τα οποία αρχικά θα είναι 0. Όταν κάθε thread φτάσει στο σημείο που θέλεις, τότε θα κάνει το δικό του flag 1. Μετά θα ελέγχει όλα τα flags και όταν όλα γίνουν 1 τότε θα μπορεί να συνεχίσει με την εκτέλεση του.

 

Αυτό που πρέπει να προσέξεις εδώ είναι να βάλεις τα threads που περιμένουν να κάνουν sleep για να μην ελέγχουν συνέχεια το array με τα flags, αυτό θα σου κοστίσει σε χρόνο αφού θα χρησιμοποιούν άδικα CPU κάνοντας συνεχείς ελέγχους.

 

 

Αν δεν θέλεις να χρησιμοποιήσεις array και θέλεις να χρησιμοποιήσεις μόνο μία μεταβλητή, π.χ. έναν counter τότε θα πρέπει να φροντίσεις ότι η πρόσβαση στη μεταβλητή του counter είναι thread safe. Εδώ πρέπει να χρησιμοποιήσεις κάποιο semaphore.

 

 

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...