Ohjelmointi

Kaksi senttiäni Mutexissa ja semaforissa C #: ssä

Kierteen synkronointia käytetään estämään useita ketjuja pääsemästä jaettuun resurssiin samanaikaisesti. Mutex ja semafori ovat kaksi tärkeintä asiaan liittyvää käsitettä. Ymmärretään, mitä molemmat ovat ja milloin meidän pitäisi käyttää niitä.

Ennen kuin aloitamme keskustelun, katsotaanpa nopeasti peruskäsitteet. Lanka on prosessin pienin toteutusyksikkö. Pohjimmiltaan monisäikeinen ketju auttaa sinua suorittamaan useita tehtäviä samanaikaisesti ja lisää siten sovelluksen kokonaistehoa.

Mutex on synkronointiprimitiivi, joka voi toimia eri prosesseissa - ts. Sitä voidaan käyttää prosessien väliseen synkronointiin. Semafori päinvastoin on sellainen, jonka avulla voit rajoittaa ketjujen määrää, joilla on pääsy jaettuun resurssiin samaan aikaan. Pohjimmiltaan semafori on yleisempi muoto Mutexista.

Semaforia käytetään rajoittamaan ketjujen määrää, joilla voi olla pääsy jaettuun resurssiin samanaikaisesti. Pohjimmiltaan sitä käytetään rajoittamaan tietyn jaetun resurssin kuluttajien määrää samanaikaisesti. Voit hyödyntää semaforia hyödyntämällä ei-yksinomaista lukitusta ja siten rajoittaa samanaikaisuutta.

Huomaa, että Mutexia käytetään lukitsemiseen jaettuun resurssiin. Toisin sanoen, Mutex antaa sinun hankkia toisiaan sulkevan lukon - jokaisella ketjulla olisi pääsy jaettuun resurssiin tiettynä ajankohtana. Eksklusiivista lukitusta käytetään varmistamaan, että yksi ja vain yksi lanka voi päästä kriittiseen osaan. Kriittinen osa voidaan määritellä tietorakenteeksi tai resurssiksi, jonka useat ketjut jakavat, mutta yhdellä ja vain yhdellä säikeellä voi olla pääsy siihen milloin tahansa.

Luokka System.Threading.Mutex edustaa Mutexia ja System.Threading.Semaphore-luokkaa käytetään Semaforien kanssa työskentelyyn. Voit lukita WuteOne-menetelmän Mutex-luokan esiintymissä ja käyttää ReleaseMutex-menetelmää lukituksen avaamiseen.

Mutex mutexObject = uusi Mutex (väärä, "Demo");

if (! mutexObject.WaitOne (TimeSpan.FromSeconds (10), väärä))

     {

Console.WriteLine ("Lopetetaan toistaiseksi, koska toinen ilmentymä on käynnissä ...");

palata;

     }

Jos haluat luoda semaforin C #: ssä, sinun on luotava semaforiluokan esiintymä. Kun luot semafori-esiintymää, sinun on välitettävä kaksi argumenttia sen argumentin rakentajalle. Ensimmäistä argumenttia käytetään osoittamaan alkuperäisten resurssimerkintöjen lukumäärä, toista argumenttia käytetään määrittämään samanaikaisten resurssimerkintöjen enimmäismäärä. Huomaa, että jos haluat varata kaikki paikat luotaville uusille säikeille, sinun on määritettävä molemmille parametreille samat arvot. Seuraava koodinpätkä kuvaa, kuinka voit luoda semaforin C #: ssä.

public staattinen semafoorilankaPool = uusi semafori (3, 5);

Katso yllä annettu koodinpätkä. Yllä oleva käsky luo semaforiobjektin nimeltä threadPool, joka tukee enintään 5 samanaikaista pyyntöä. Huomaa, että alkuarvoksi asetetaan 3, kuten konstruktorin ensimmäisessä parametrissa ilmoitetaan. Tämä tarkoittaa, että 2 paikkaa on varattu nykyiselle säikeelle ja 3 paikkaa on käytettävissä muille säikeille. Kirjoitetaan nyt koodi!

Seuraava koodinpätkä osoittaa, kuinka voit luoda ja aloittaa 10 säiettä käyttämällä järjestelmässä käytettävissä olevaa säieluokkaa. Huomaa, kuinka ThreadStart-edustajaa on käytetty.

(int i = 0; i <10; i ++)

{

Thread threadObject = new Thread (uusi ThreadStart (PerformSomeWork));

threadObject.Name = "Kierteen nimi:" + i;

threadObject.Start ();

}

Tässä on PerformSomeWork-menetelmän koodi. Tämä on menetelmä, joka sisältää koodin semaforien kanssa työskentelyyn.

yksityinen staattinen void PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Säie {0} on kriittisen osan sisällä ...", Thread.CurrentThread.Name);

Lanka.Uni (10000);

threadPool.Release ();

       }

Katso yllä annettu PerformSomeWork-menetelmä. WaitOne-menetelmää kutsutaan Semaphore-esiintymäksi estämään nykyinen säie, kunnes signaali vastaanotetaan. Release-menetelmää kutsutaan samassa instanssissa semaforin vapauttamiseksi. Tässä on täydellinen koodiluettelo viitteellesi.

luokka SemaforiDemo

   {

public staattinen semafoorilankaPool = uusi semafori (3, 5);

public static void Main (merkkijono [] args)

       {

(int i = 0; i <10; i ++)

           {

Thread threadObject = new Thread (uusi ThreadStart (PerformSomeWork));

threadObject.Name = "Kierteen nimi:" + i;

threadObject.Start ();

           }

Console.ReadLine ();

       }

yksityinen staattinen void PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Säie {0} on kriittisen osan sisällä ...", Thread.CurrentThread.Name);

Lanka.Uni (10000);

threadPool.Release ();

       }

   }

$config[zx-auto] not found$config[zx-overlay] not found